为什么两个相同的对象不相等?

IT技术 javascript
2021-01-20 17:58:04

看起来下面的代码应该返回一个真,但它返回假。

var a = {};
var b = {};

console.log(a==b); //returns false
console.log(a===b); //returns false

这有什么意义?

6个回答

常规 ( ==) 和严格 ( ===) 相等之间的唯一区别是严格相等运算符禁用类型转换。由于您已经在比较相同类型的两个变量,因此您使用的相等运算符的类型并不重要。

无论您使用常规相等还是严格相等,对象比较仅true 在您比较相同的完全对象时评估为

也就是说,给定var a = {}, b = a, c = {};, a == a, a == b, , 但是a != c

两个不同的对象(即使它们都具有零或完全相同的属性)永远不会进行相等的比较。如果您需要比较两个对象属性的相等性,这个问题有非常有用的答案

使用 underscorejs.js isEqual 比较 JSON 对象underscorejs.org/#isEqual
2021-03-31 17:58:04

这有什么意义?

因为对象引用的“相等性”,就=====运算符而言,纯粹是基于引用是否指向同一个对象。这在抽象相等比较算法(由 使用==)和严格相等比较算法(由 使用===)中有明确规定

在您的代码中,当您说a==bor 时a===b,您不是在比较对象,而是在比较中的引用ab查看它们是否引用同一个对象。这是JavaScript的只是如何定义的,并且在许多(但不是全部)其他语言有多么平等运营线的定义(Java,C#[除非操作员被覆盖,因为它是string],和C ++为例)。

JavaScript 没有内置的等价概念,对象之间的比较表明它们是否等价(例如,具有相同的属性和相同的值,如 Java 的Object#equals)。您可以在自己的代码库中定义一个,但没有任何内在的定义它。

来自 Javascript 权威指南。

对象不按值进行比较:即使两个对象具有相同的属性和值,它们也不相等。数组也是如此:即使它们具有相同顺序的相同值。

var o = {x:1}, p = {x:1};  // Two objects with the same properties
o === p                    // => false: distinct objects are never equal 
var a = [], b = [];        // Two distinct, empty arrays 
a === b                    // => false: distinct arrays are never equal 

对象有时被称为引用类型,以区别于 JavaScript 的原始类型。使用这个术语,对象值是引用,我们说对象是通过引用比较的:当且仅当它们引用相同的底层对象时,两个对象值是相同的。

var a = {};   // The variable a refers to an empty object. 
var b = a;    // Now b refers to the same object. 
b.property = 1;     // Mutate the object referred to by variable b. 
a.property          // => 1: the change is also visible through variable a. 
a === b       // => true: a and b refer to the same object, so they are equal. 

如果我们想比较两个不同的对象,我们必须比较它们的属性。

use JSON.stringify(objname);

var a = {name : "name1"};
var b = {name : "name1"};

var c = JSON.stringify(a);
var d = JSON.stringify(b);

c==d;
//true

===对象严格相等运算符检查身份。

如果两个对象引用同一个对象,则它们严格相等。

这是两个不同的对象,所以它们是不同的。

想想两页空白的纸。他们的属性是一样的,但又不是一回事。如果你在其中一个上写一些东西,另一个就不会改变。

@josh3736:是的。并且您几乎不应该使用==.
2021-03-13 17:58:04
常规相等运算符的工作方式相同。唯一的区别是是否允许类型转换,这在这种情况下无关紧要。
2021-03-16 17:58:04
如果您仍然想检查相等性,请在对象上使用 .equals() 方法
2021-04-04 17:58:04