Por que {} + [] devolve 0 em Javascript? [duplicado]

possível duplicado:
Qual é a explicação para esses comportamentos bizarros de JavaScript mencionados na palestra " Wat " para CodeMash 2012?

sei que quando [] é coagido a uma cadeia devolve a cadeia vazia (""), e quando {} é coagido a uma cadeia devolve "[object Object]".

quando corro [] + {} na consola Javascript do meu navegador, ele retorna como eu esperaria:

>> [] + {}
"[object Object]"

Mas quando corro {} + [], devolve um valor completamente inesperado:

>> {} + []
0
O que pode estar a fazer com que volte?

 31
Author: Community, 2012-08-13

3 answers

Quando existe um { no início de uma declaração, será interpretado como um bloco, que pode conter zero ou mais declarações. Um bloco sem declarações nele terá um valor de continuação vazio.

Em outras palavras, neste caso, {} é interpretado como um bloco de código vazio.

A declaração termina após a cinta final }, o que significa que os próximos três caracteres +[] compreendem uma declaração própria.

No início de um expressão ou declaração, + é o unário mais operador, que coage o seu operando a um número.

Assim +[] é o mesmo que Number([]), que avalia a 0.

Em resumo, {} + [] é um bloco de código vazio seguido de uma matriz coagida a um número.


[13]tudo isso dito, se você avaliar {} + [] dentro de uma expressão , ela irá devolver o que você espera:
>> ({} + []) 
"[object Object]" 
Outra coisa interessante é que você não pode começar uma declaração com um objeto literal porque o intérprete vai tentar analisá-lo como uma declaração. A fazer isto
{ "object": "literal" };

Irá lançar um erro de sintaxe.

 52
Author: Peter Olson, 2012-08-13 17:17:35

Porque o {} é tratado como um bloco. Assim, a sua declaração é realmente:

{

//empty block here
}

+[] //0 same as Number([])

É por isso que este javascript é inválido:

eval('{hello: "world", key: "value"}') //Syntax error

Você pode adicionar () para torná-lo uma expressão (os blocos não podem ser usados numa expressão, por isso será o inicializador de objectos:

eval('({hello: "world", key: "value"})') //Object
 19
Author: Esailija, 2012-08-13 17:12:08
O bloco vazio é coagido a um zero. Então o operador {[[0]} decide coagir o [] para um número.
 2
Author: Juan Mendes, 2012-08-13 17:14:46