众所周知,{}定义对象的方式更短,就像定义[]数组一样。
但现在我想知道为什么:
{} != ({})
{}评估为未定义({})评估为“正确”对象
为什么 JavaScript 会这样?
例如1等于(1),那么为什么{}不等于({})呢?
众所周知,{}定义对象的方式更短,就像定义[]数组一样。
但现在我想知道为什么:
{} != ({})
{} 评估为未定义({}) 评估为“正确”对象为什么 JavaScript 会这样?
例如1等于(1),那么为什么{}不等于({})呢?
{} != ({})
这是一个语法错误。
语法错误:意外的令牌!=
{}是那样的暧昧。它是一个空块,还是一个空对象字面量?它失败是因为比较运算符不能跟随块。
用括号将其包裹起来,使解析器将其视为表达式。表达式不能包含块,因此它知道它是一个对象。
但是,如果您将该比较包装在表达式中...
({} != ({}))
...它仍然是正确的,因为具有分配给它们的值的对象的变量是指向它们的指针,因此,它们永远不会被它们的内容复制(尽管这与您的示例无关)。因此,它们的指针始终不同,比较失败。
这也意味着比较指向同一对象的两个变量将按预期工作,因为它们的指针将相同。
{} != {}是真的,因为两者{}都是完全不同的对象。但是,引用同一对象的变量保持相等:
var a = {},
b = a;
assert( a == b )