Algumas bizarrices do JavaScript

O JavaScript possui várias bizarrices no retorno de algumas operações. Veja algumas delas:

[] is equal ![]

Um Array não equivale a um array:

[] == ![] // -> true

💡 Explicação:

 

true é falso

!!'false' ==  !!'true'  // -> true
!!'false' === !!'true' // -> true

💡 Explicação:
Acompanhe esse passo-a-passo:

// true is ‘truthy’ and represented by value 1 (number), ‘true’ in string form is NaN.
true == ‘true’ // -> false
false == ‘false’ // -> false

// ‘false’ is not empty string, so it’s truthy value
!!’false’ // -> true
!!’true’ // -> true

7.2.13 Abstract Equality Comparison
 

baNaNa

'b' + 'a' + + 'a' + 'a'

Piada oldschool do JavaScript mas um pouco diferente. Aqui está a original:

'foo' + + 'bar' // -> 'fooNaN'

💡 Explicação:
A expressão é resolvida como ‘foo’ + (+’bar’), que converte ‘bar’ em erro de conversão para número.

 

[] é verdadeiro, mas não true

Um array é um valor real mas não é equivalente a true.

!![]       // -> true
[] == true // -> false

💡 Explicação:
Seguem links das seções correspondentes as especificações do ECMA-262:

 

null é ireal, mas não é false

Mesmo que null não exista, ele não é igual a false.

!!null        // -> false
null == false // -> false

De qualquer forma, outros valores que não existe como 0 ou ” são equivalentes a falso.

0 == false  // -> true
'' == false // -> true

💡 Explicação:

A explicação é a mesma para o exemplo anterior.

 

Traduzi alguns desses itens bizarros, mas para ver todas acesse a página WTFjs no GitHub.

E aí gostou? Partiu TypeScript? :p

Fonte: https://github.com/denysdovhan/wtfjs