繁体   English   中英

Javascript:为什么两个对象不相等?

[英]Javascript: Why are two objects not equal?

我知道SO上有类似的问题,但没有一个能提供我想要的答案。

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

在此输入图像描述

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

如果("string" === "string")导致为true ,那么为什么({ } === { })不会导致为真?

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

为什么JavaScript以这种方式定义? 这个决定背后有原因吗? 或者只是因为它看到做完成的事情?

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

var obj = new Object();

var obj = {};

因此,只要您使用{}就会创建一个新对象。

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

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

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

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

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

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

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

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

因为javascript中的字符串即使是一个对象也被认为是一个原语,就像一个整数或一个布尔值,并且它们总是按值进行比较,因为这就是一个原语,一个简单的原子值..所以"string" == "string"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 == this或者如果obja == objb那么我们至少可以知道我们在谈论什么对象/参考..

所以总结原语总是会被它们的价值进行比较,而复杂的类型会通过它们的参考进行比较,这就是大多数语言所做的事情,而不是c ++的灵感或其他只是“游戏规则”的灵感

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM