在Javascript中,为什么{a:1} == {a:1}会出错,({a:1})== {a:1}会有效吗?

时间:2011-10-10 13:42:07

标签: javascript

这是在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},为什么会这样?

3 个答案:

答案 0 :(得分:16)

因为{a : 1}是一个声明,但==不允许其遵循

({ a : 1 })是一个表达式,允许后跟==

这基本上是语法中定义的规则。

但请注意({ a: 1} == { a: 1})有效。所以等价表达式是有效的。

这意味着{a : 1} == { a : 1 }根本不是有效的语句

12.4 of the ES5.1 spec

  

注意ExpressionStatement不能以开括号大括号开头,因为这可能会使其与Block不一致。此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致。

作为旁注,你会发现

({a : 1}) != {a : 1}因为它们是两个对象

答案 1 :(得分:13)

解析器将前导“{”字符解释为启动语句块,而不是启动表达式。这是语言中的含糊不清,这就是它的解决方式(根据规范)。

这类似于function关键字周围的含糊不清。当一个语句以function开头时,它是一个函数声明语句,即使语法可能作为表达式的开头。解析器必须根据一些规则解决这些含糊不清的问题。

答案 2 :(得分:0)

我认为您可能希望先将两个对象分配给变量,然后比较这两个变量,而不是在语句中创建它们。您的问题依赖于您在声明中分配的事实。通过添加(),您将该赋值作为语句包装,并且它可以正常工作。