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