Conversão de tipos em JavaScript

Um dia desses eu recebi um quebra-gelo no Telegram, com o seguinte: De cara eu pensei que seria false, mas fiz questão de rodar no console e ver no que dava. Claro que deu false. Mesmo assim, quis entender o motivo de Number(null) retornar `` e fui procurar na documentação do ECMAScript 6, ou ECMAScript

Um dia desses eu recebi um quebra-gelo no Telegram, com o seguinte:

De cara eu pensei que seria false, mas fiz questão de rodar no console e ver no que dava. Claro que deu false. Mesmo assim, quis entender o motivo de Number(null) retornar “ e fui procurar na documentação do ECMAScript 6, ou ECMAScript 2015.

O JavaScript, ou ECMAScript, tem um conjunto de operações abastratas que ocorrem por baixo dos panos. Dentre estas operações, temos as conversões de tipos (Types Conversions), que é executada sempre que necessário – que é justamente o caso do Number(null).

Existem várias operações abstratas de conversão de tipos em JS, mas vou abordar apenas as mais comuns.

ToPrimitive

Praticamente tudo em JS é tratado como um objeto, então a conversão ToPrimitive transforma o input para o seu devido tipo primitivo, isto é, retorna o valor sem ser um objeto. Talvez seja um pouco óbvio e muito comum, mas é interessante ver no console. Primeiro vejamos os tipos primitivos:

Agora, já que temos objetos pra quase tudo em JS, veja o retorno ao rodar no console do Chromium/Chrome:

Veja que os objetos sempre guardam o valor primitivo, que é retornado por baixo dos panos quando precisamos utilizar o valor para alguma outra operação, como por exemplo:

Para converter valores do tipo Object, é feita uma análise de qual o valor primitivo do objeto, por exemplo:

ToNumber

A operação abstrata ToNumber transforma a entrada em um tipo numérico, e é aqui que entramos naquele exemplo do Number(null).

A conversão para valores numéricos funciona basicamente com as seguintes regras:

Então, por regra, é por isso que Number(null) retorna 0, e isso não siginifica que null == 0, já que são valores primitivos diferentes.

Mas e quanto a conversão de string para number, Number("2016")?

Para fazer a conversão de uma string, o ToNumber tenta interpretar a string na codificação UTF-16 e caso não consiga, retorna NaN, assim:

ToBoolean

A operação abstrata ToBoolean transforma a entrada em um tipo booleano, que assim como o ToNumber, segue algumas regras. Vamos lá:

ToString

A operações abstratas ToString tem a função de transformar a entrada em uma string, e assim como as outras operações aqui descritas, também segue as suas regras de conversão, que são:

Para converter um Number para string, há uma série de considerações a se fazer, vou citar algumas. Tomando como base String(Number(m)):

ToObject

Por último, temos a ToObject, que transforma a entrada em um objeto, quando possível. Até aqui já tivemos a oportinudade de perceber esse tipo de conversão, já que alguns dos exemplos mostraram como ToObject funciona. O que acontece basicamente é que ToObject avalia o tipo primitivo da entrada e retorna um novo objeto daquele tipo, com o valor da entrada. Veja bem:

Enfim, achei a resposta para o Number(null) retornar “ e deu pra aprender um bocado. Recomendo que você dê uma olhada na documentação do ECMAScript, existem várias outras operações abstratas interessantes.

Como curiosidade, olha só e tente adivinhar qual o resultado do último:

O próprio Boolean(true) retorna o valor primitivo true, que faz com que o objeto gerado em Object(true) sofra uma conversão para o valor primitivo e assim fazer a igualdade. Já new Boolean(true) retorna um novo objeto, que na comparação == retorna false. Isso porque ao comparar dois objetos em JS, a comparação é para saber se os dois objetos são iguais. Faça o teste: {} == {}.

Bom… é isso. Espero que eu tenha sido claro, mas se você ficou com dúvidas, me mande um tweet, vamos trocar ideia (:

Até a próxima.


Este post foi originalmente postado em meu blog, no dia 12 de junho de 2016, no link abaixo:

https://blog.gabsprates.com/2016/07/12/conversao-de-tipos-em-js.html

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *