似乎以下代码应返回true,但返回false。

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

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


这有什么道理?

评论

在Java语言中可能重复,为什么[1,2] == [1,2]或({a:1})==({a:1})为假?也相关:stackoverflow.com/questions/8699816/in-javascript-why-object

是的,几乎是相同的问题。

您正在尝试比较两个对象。仅当两个js对象都指向相同的内存位置时,它们才返回true。因此,如果要比较,对象的内容是否相同。您必须先将它们转换为JSON.stringify(a)== JSON.stringify(b)
之类的字符串。

#1 楼

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

无论使用正则还是严格相等,对象比较仅对true求值。您比较相同的精确对象。

,即给定var a = {}, b = a, c = {};a == aa == b,但是a != c

两个不同的对象(即使它们都具有零或相同的精确值)属性)将永远不会平等地进行比较。如果需要比较两个对象的属性的相等性,此问题将提供非常有用的答案。

评论


使用underscorejs.js isEqual比较JSON对象underscorejs.org/#isEqual

– Remo H. Jansen
2012年11月5日12:00

#2 楼


这有什么意义?


因为在=====运算符方面,对象引用的“相等性”完全基于引用是否引用相同的引用目的。在抽象等式比较算法(由==使用)和严格等式比较算法(由===使用)中清楚地列出了这一点。

在您的代码中,当您说a==ba===b时,不比较对象,您要比较ab中的引用以查看它们是否引用相同的对象。这就是定义JavaScript的方式,并且与定义许多(但不是全部)其他语言中的相等运算符的方式一致(Java,C#[除非该运算符被覆盖,例如string的覆盖,例如C43)。

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

#3 楼

与《 Java权威指南》相同。

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




 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.  





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

#4 楼

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


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



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

想想两张空纸。它们的属性是相同的,但是它们不是相同的东西。如果您在其中一个上写东西,则另一个不会改变。

评论


并且仍然需要检查是否相等,对对象使用.equals()方法

– Wouter
2012年7月28日在22:05

常规相等运算符的工作方式相同。唯一的区别是是否允许类型转换,在这种情况下这无关紧要。

– josh3736
2012年7月28日在22:13

@ josh3736:是的。并且几乎应该永远不要使用==。

–卡洛里·霍瓦斯
2012年7月28日在22:17

#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


#6 楼


这有什么意义?


想象这两个对象:

var a = { someVar: 5 }
var b = { another: 'hi' }


现在,如果你做了a === b,您会直观地认为这应该是错误的(正确)。但是您认为这是错误的,是因为对象包含不同的键,还是因为它们是不同的对象?接下来,想象从每个对象中删除键:

delete a.someVar
delete b.another


两个现在都是空对象,但是相等检查仍然完全相同,因为您仍在比较是否或ab不是同一对象(不是它们是否包含相同的键和值)。

#7 楼

以下是{} === {}为什么在JavaScript中返回false的简要说明:

从MDN Web文档-Working with objects: Comparing objects

在JavaScript中,对象是引用类型。即使两个不同的对象具有相同的属性,也永远不会相等。仅将同一对象引用与其自身进行比较会产生true。

 // Two variables, two distinct objects with the same properties
var fruit = {name: 'apple'};
var fruitbear = {name: 'apple'};

fruit == fruitbear; // return false
fruit === fruitbear; // return false
 

// Two variables, a single object
var fruit = {name: 'apple'};
var fruitbear = fruit;  // Assign fruit object reference to fruitbear

// Here fruit and fruitbear are pointing to same object
fruit == fruitbear; // return true
fruit === fruitbear; // return true

fruit.name = 'grape';
console.log(fruitbear); // output: { name: "grape" }, instead of { name: "apple" }


有关比较运算符的更多信息,请参见比较运算符。


#8 楼

In Javascript each object is unique hence `{} == {}` or `{} === {}` returns false. In other words Javascript compares objects by identity, not by value.

 1. Double equal to `( == )` Ex: `'1' == 1` returns true because type is excluded 
     
 2. Triple equal to `( === )` Ex: `'1' === 1` returns false compares strictly, checks for type even


#9 楼

这是一种解决方法:Object.toJSON(obj1) == Object.toJSON(obj2)

通过转换为字符串,combrasion基本将在字符串中

评论


问题在于影响的原因,观察到的解释,而不是比较两个对象的“解决方案”。

–木崎
2012年7月28日在22:19

鉴于不能保证对象中属性的顺序,因此(永远)无效。即使它们相同,也可能以{a:1,b:2}!= {b:2,a:1}结尾。此外,具有循环引用的对象不会转换为JSON。

– josh3736
2012年7月28日在22:19

首先,这不能回答问题。其次,JavaScript中没有定义Object.toJSON。第三,假设您是从ES5中获取JSON.stringify,则不能依赖于它为具有相同属性和相同值的两个对象返回完全相同的字符串,因为规范中没有要求它的属性(即无序)以相同的顺序列出。引擎可以自由地执行其想要的操作,即使对象最终具有相同的属性和相同的值,它也可能根据对象的构造方式而有所不同。

– T.J.拥挤者
2012年7月28日在22:20



没错,我从来没有想过,因为我总是用相同顺序的参数来制定对象。是的,Kissaki,非常正确,我只是想举例说明如何解决它。

– Anze Jarni
2012年7月28日在22:22

@AnzeJarni:“ ...我总是用相同的参数顺序来配制对象...”假设您是指属性,那么对象属性也没有顺序。尽管被授予,但如果您创建了一个对象并向其添加a,b和c属性;然后创建另一个对象并向其中添加a,b和c属性,这确实是一个非常奇怪的引擎,确实将这些序列化到JSON的方式不同。但是,如果您通过先添加c,b然后再添加a来创建第二个对象,那根本就不会很奇怪。

– T.J.拥挤者
2012年7月28日在22:22