35 votes

Pourquoi {} + [] renvoie-t-il 0 en Javascript?

Double Possible:
Qu'est-ce que l'explication de ces bizarres JavaScript comportements mentionnés dans le " Wat " parler pour CodeMash 2012?

Je sais que lorsqu' [] est contrainte à une chaîne, il retourne une chaîne vide (""), et lors de l' {} est contrainte à une chaîne, il retourne "[object Object]".

Lorsque j'exécute [] + {} dans mon navigateur de la console Javascript, il retourne que j'attend:

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

Mais lorsque j'exécute {} + [], elle retourne un de tout à fait inattendu de la valeur:

>> {} + []
0

Quelle pourrait être l'origine le retour d' 0?

56voto

Peter Olson Points 30452

Quand il y a un { au début de l'énoncé, il sera interprété comme un bloc, qui peut contenir zéro, un ou plusieurs états. Un bloc avec aucune des instructions qu'il aura un vide continuation de la valeur.

En d'autres termes, dans ce cas, {} est interprété comme un vide bloc de code.

La déclaration se termine après la fin corset }, ce qui signifie que les trois caractères +[] constituent une déclaration de leur propre.

Au début de l'instruction ou de l'expression, + est unaire opérateur plus, ce qui contraint son opérande pour un certain nombre.

Donc, +[] est le même que Number([]), ce qui donne 0.

En bref, {} + [] est vide bloc de code, suivi par un tableau contraint à un certain nombre.


Tout cela étant dit, si vous évaluez {} + [] à l'intérieur d'une expression, il sera de retour ce que vous attendez:

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

Une autre chose intéressante est que vous ne pouvez pas commencer une déclaration avec un objet littéral parce que l'interprète va essayer de l'analyser comme une déclaration. Faire cela

{ "object": "literal" };

va jeter une erreur de syntaxe.

19voto

Esailija Points 74052

Parce que le {} est traité comme un bloc. Ainsi, votre déclaration est en fait:

 {

//empty block here
}

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

C'est pourquoi ce n'est pas Javascript valide:

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

Vous pouvez ajouter () pour en faire une expression (les blocs ne peuvent pas être utilisés dans une expression donc ce sera l'initialiseur d'objet:

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

2voto

Juan Mendes Points 31678

Le bloc vide est contraint à un zéro. Ensuite, l'opérateur + décide de contraindre le [] à un nombre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X