为什么 {} != ( {} ) 在 JavaScript 中?

IT技术 javascript
2021-03-16 20:15:17

众所周知,{}定义对象的方式更短,就像定义[]数组一样。

但现在我想知道为什么:

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

为什么 JavaScript 会这样?

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

2个回答
{} != ({})

这是一个语法错误。

语法错误:意外的令牌!=

{}是那样的暧昧。它是一个空块,还是一个空对象字面量?它失败是因为比较运算符不能跟随块。

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

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

({} != ({}))

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

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

你能告诉我它/*Instance methods*/ hasOwn = ({}).hasOwnProperty,jQuery 源代码中的作用吗?(是)
2021-04-24 20:15:17
@dollarVar 这可能是它自己的问题。这是同样的事情,作者想要引用Object.prototype.hasOwnProperty,但通过对象文字访问它。由于我的回答中提到的歧义,它必须用括号括起来,否则它会被解析为一个块并且块上没有属性查找:)
2021-04-28 20:15:17

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

​var a = {},
    b = a;

assert( a == b )​
你不应该===在 Javascript 中使用来检查引用吗?
2021-04-16 20:15:17
@Kevin:===是关于类型的。对象总是通过引用进行比较
2021-05-10 20:15:17