15

众所周知,{}定义对象的更短方法[]是数组。

但现在我想知道为什么:

{} != ({})
  • {}评估为未定义
  • ({})评估为“正确”对象

为什么 JavaScript 会这样?

例如1等于(1),那为什么{}不等于({})呢?

4

2 回答 2

23
{} != ({})

这是一个语法错误。

SyntaxError:意外的令牌!=

{}像那样模棱两可。它是一个空块,还是一个空对象字面量?它失败了,因为比较运算符不能跟随一个块。

用括号括起来使解析器将其视为表达式。表达式不能包含块,因此它知道它是一个对象。

但是,如果您将该比较包装在表达式中...

({} != ({}))

...这仍然是正确的,因为具有分配给它们的值的对象的变量是指向它们的指针,因此,它们永远不会被它们的内容复制(尽管这与您的示例无关)。因此,它们的指针总是不同的,比较失败。

这也意味着比较指向同一对象的两个变量将按预期工作,因为它们的指针是相同的。

于 2013-01-02T01:25:12.223 回答
5

{} != {}是真的,因为两者{}都是完全不同的对象。但是,引用同一对象的变量保持相等:

​var a = {},
    b = a;

assert( a == b )​
于 2013-01-02T01:25:03.180 回答