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