В Javascript, почему {a: 1} == {a: 1} дает ошибку, и ({a: 1}) == {a: 1} будет работать?

Это сделано в Firebug:

>>> {a : 1} == {a : 1}
SyntaxError: syntax error
[Break On This Error] {a : 1} == {a : 1} 

>>> ({a : 1}) == {a : 1}
false

Так что это должно быть ({a : 1}) == {a : 1}, почему это?

Ответы

Ответ 1

Потому что {a : 1} - это объявление, и ему не разрешено следовать == однако

({ a : 1 }) является выражением и ему может следовать ==

Это в основном правила, определенные в грамматике.

Однако обратите внимание, что ({ a: 1} == { a: 1}) действителен. Таким образом, выражение эквивалентности действительно.

Это означает, что {a : 1} == { a : 1 } просто не является допустимым оператором.

12.4 из спецификации ES5.1 говорит

ПРИМЕЧАНИЕ. ExpressionStatement не может начинаться с открывающей фигурной скобки, потому что это может сделать ее неоднозначной с блоком. Кроме того, выражение ExpressionStatement не может начинаться с ключевого слова function, поскольку это может сделать его неоднозначным с помощью FunctionDeclaration.

В качестве опоры вы обнаружите, что

({a : 1}) != {a : 1}, потому что это два новых объекта

Ответ 2

Ведущий символ "{" интерпретируется синтаксическим анализатором как начало блока операторов, а не как начало выражения. Это двусмысленность в языке и то, как оно разрешилось (согласно спецификации).

Это похоже на двусмысленность вокруг ключевого слова function. Когда инструкция начинается с function, это оператор объявления функции, хотя синтаксически это может быть предназначено как начало выражения. Парсеры просто должны разрешать такие неоднозначности в соответствии с некоторыми правилами.

Ответ 3

Я думаю, вы могли бы сначала перенести оба объекта в переменные и сравнить эти две переменные вместо их создания в инструкции. Ваша проблема связана с тем фактом, что вы назначаете в заявлении. Добавляя(), вы завершаете это присваивание как инструкцию, и оно отлично работает.