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
?
Réponses
Trop de publicités?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.
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