为什么两个相同的物体彼此不相等?

Max*_*axx 39 javascript

看起来像下面的代码应该返回一个true,但它返回false.

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

console.log(a==b); //returns false
console.log(a===b); //returns false
Run Code Online (Sandbox Code Playgroud)

这有什么意义?

jos*_*736 39

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

无论您使用常规还是严格相等,对象比较仅true 在您比较同一个确切对象时进行评估.

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

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


T.J*_*der 13

这有什么意义?

因为对象引用的"相等",根据=====运算符,纯粹基于引用是否引用相同的对象.这在抽象等式比较算法(由...使用==)和严格相等比较算法(由...使用===)中清楚地阐述.

在你的代码中,当你说a==b或者a===b你没有比较对象时,你要比较它们中的引用ab查看它们是否引用同一个对象.这就是如何定义JavaScript,以及如何定义许多(但不是全部)其他语言中的相等运算符(Java,C#[除非运算符被覆盖,因为它是string ],以及C++).

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


小智 5

来自 The Definitive Guide to 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 
Run Code Online (Sandbox Code Playgroud)

对象有时被称为引用类型,以区别于 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. 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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
Run Code Online (Sandbox Code Playgroud)