Pourquoi une syntaxe Javascript est-elle sans équité, mais pas un objet nu?

Dans ma console Javascript (en Chrome) j'essaie ceci:

{ 'a' : 1 } 

Et obtenir SyntaxError: Unexpected token :

Mais cela fonctionne:

  ['a', 1] 

Ce qui donne???

C'est parce que les accolades ont deux utilisations: soit l'introduction d'un bloc, soit le début d'un objet littéral (ce dernier étant une expression ).

La console ne peut pas indiquer laquelle, donc elle suppose un bloc d'instructions, et plus tard, trouve que le contenu du bloc ne peut pas être analysé comme un énoncé.

Pour les littéraux de tableaux avec crochets, cette ambiguïté n'existe pas.

L'ambiguïté peut être résolue en modifiant le contexte afin que le {...} soit interprété comme une expression plutôt que comme un bloc d'instructions, par exemple en le transformant en RHS d'un opérateur, en l'enroulant entre parenthèses ou en le passant comme fonction Paramètre, etc.

C'est un bloc :

 { var x = 'stuff' function doStuff(arg) { alert(arg) } doStuff(x) } 

Il va alerter les stuff .

Maintenant, à propos de votre exemple: JavaScript pense que c'est un bloc, comme ceci:

 { 'a' : 1 } 

Puisque 'a' : 1 n'est pas une déclaration valide, il échoue.

Notez que si vous faites

 'x' + { 'a' : 1 } 

Cela fonctionne, car il n'y a aucun moyen qu'un bloc puisse venir après un + .

Comme d'autres l'ont souligné, cela s'explique par le fait que les accolades ont une double utilisation.

La façon la plus simple de contourner l'ambiguïté est d'ajouter une paire de parenthèses:

 > {'a': 1} SyntaxError: Unexpected token : > ({'a': 1}) Object {a: 1} 

Vous pouvez new Object({'a' : 1}) pour cela.