【问题标题】:Why does {} == {} return false? [duplicate]为什么 {} == {} 返回 false? [复制]
【发布时间】:2014-07-01 18:45:54
【问题描述】:

我正在写一个脚本,我有类似的东西

var myObject = {};

if (myObject == {}){
    ...
}

我惊讶地发现这被评估为假。

我自己的发现

阅读了一些 javascript 的有趣怪癖,我发现 this article,它告诉 {} 将在 if 语句中产生一个“真实”对象,例如

if ({}){ // true
    ...
}

嗯,还有更进一步的准备讨论字符串相等,它用于对象比较,表示如果它们引用相同的对象,它将返回true。 (即使{} === {} 返回 false)

我认为返回 false 的唯一原因是对象在技术上位于不同的内存地址,因此被视为不同的对象。

【问题讨论】:

  • 而你的最后一句话就是答案
  • 你加粗了错误的单词,这是你误解的关键。 “如果他们引用相同的对象,它将返回true”应该说如果他们引用相同的对象,它将返回true。
  • 你知道这不是一个问题,对吧?无论如何......我认为一个很好的解释是一个对象不能等于另一个对象。如果您有 2 个相同的橙子,这并不意味着它们是相同的橙子。
  • 将这些括号的每个实例视为“MyObject myObj = new MyObject();”在静态语言中。简单的想法。

标签: javascript


【解决方案1】:

因为每个{} 创建一个唯一的对象。你不能这样比较它们。

【讨论】:

  • 你已经打败了我:D
  • 我一般不建议使用JSON.stringify 来比较对象。它将剥离函数并对非 JSON 类型执行其他操作。观察JSON.stringify({r:/r/}) == JSON.stringify({r:{}})
  • 使用.stringify 比较一般的对象是一种不幸的方式。我当然不会称之为“正确”。除了@p.s.w.g 所描述的之外,不能保证键的顺序是相同的。
  • @p.s.w.g 好的,我删除了它。你有什么建议?
  • @RobinVanPersi 如果你想拥有像足球运动员一样的昵称,你应该使用“Robin van Persie”:)
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2021-11-10
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2016-06-20
  • 2016-03-29
相关资源
最近更新 更多