【问题标题】:Javascript: Why are two objects not equal?Javascript:为什么两个对象不相等?
【发布时间】:2015-10-23 10:12:23
【问题描述】:

我知道在 SO 上有类似的问题,但没有一个提供我正在寻找的答案。

在 JavaScript 中,如果执行以下操作,结果将为 false:

我知道这与规范中如何定义 JavaScript 有关,但为什么会这样呢?这是违反直觉的。

如果("string" === "string") 的结果是true,那么为什么({ } === { }) 的结果不是真的?

我在某处看到,相等算法的设计类似于 C++ 或 C#,但这就像发明了一种全新的引擎,它使用 1/10 的燃料,而不是纯粹为了与其他汽车保持一致而使用它。

为什么 JavaScript 是这样定义的?这个决定背后有原因吗?还是只是为了让人们看到它正在做的事情?

【问题讨论】:

  • 它们不相等,因为它们不是同一个对象。这就是为对象定义相等性的方式。你会提出什么其他的对象相等定义,为什么?

标签: javascript object equality


【解决方案1】:

{} 是在 javascript 中创建对象的文字。那就是你可以替换

var obj = new Object();

var obj = {};

所以任何时候你使用{} 都是在创建一个新对象。

你提到的那一行,{} == {} 创建了两个不同的对象,并且都没有属性。同样,它们是相同的,例如,如果您有 equals(obj1, obj2) 方法比较 obj1 和 obj2 的属性,并且如果所有属性的值都相同,则它应该返回 true。

== 运算符不会检查属性。它检查两个对象是否都指向同一个对象/引用。

var obj1 = {};
obj2 = obj1;
console.log(obj2 == obj1); //returns true

返回真,因为 obj1 和 obj2 指向同一个引用。

最后,关于字符串"abc" == "abc",这里==运算符会查找实际的字符串内容并根据它返回true/false。

【讨论】:

  • 我明白了,这有点清楚了。感谢您的宝贵时间。
【解决方案2】:

字符串是不可变的,因此具有相同内容的两个字符串在功能上是无法区分的。

但是对象和数组是可以修改的,所以仅仅因为它们在某个特定时间恰好具有相同的内容并不意味着它们是相同的。您可以修改它们,然后它们会有所不同。

另一种说法是,如果obj1 == obj2 为真,那么当你做obj1.x = 1 时,它也会改变obj2.x

【讨论】:

  • 好的,我明白了。我一直认为,在检查相等性时,变量所持有的基本值就是比较的值。
  • 也许你的意思是obj1 = obj2 不是obj1 == obj2
  • @RubenYeghikyan 不,我的意思是如果他们相等,那么改变一个会改变另一个。
【解决方案3】:

因为 javascript 中的字符串即使是一个对象也被认为是原始的,就像整数或布尔值一样,并且它们总是按值进行比较,因为这就是原始的,一个简单的原子值.. 所以@ 987654321@, 1 = 1true == true,

但是对象是复杂类型,它们是基元的集合,比较该集合的规则不能简化为标准,{name:'a',address:'b',phone:'c'} != {name:'a',address:'b'} 是因为没有相同数量的属性吗?那么在那种情况下{name:'x',address:'y'} == {name:'a',address'b'}?它们具有相同的属性,但具有不同的值,或者使其更复杂{name:'x',address'y'} == {address:'y',name:'c'}.. 顺序重要吗..

所以如果复杂对象的比较不能以简单的标准方式进行,最好让程序员来实现适用于这种情况的规则。

那么语言可以实现什么比较至少有用和可靠..比较两个对象引用是否相等这将允许进行验证,如obj == nullobj == thisobja == objb这样我们至少可以知道我们在谈论什么对象/引用..

所以总而言之,原始类型总是通过它们的值进行比较,而复杂类型则通过它们的引用进行比较,这是大多数语言的做法,而不是受 c++ 的启发或仅仅是“游戏规则”

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多