比较JavaScript中的对象

时间:2014-08-05 06:15:43

标签: javascript

我有这段代码:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)

它在控制台中返回 false

我也有这段代码:

var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  

它在控制台中返回 true

我知道'==='是一个相等运算符,但我不知道它是如何在对象上运行的。

为什么第一个示例返回false?

10 个答案:

答案 0 :(得分:80)

看到这个球?它的颜色是红色的。称之为ball1。

看到这个球?它的颜色是红色的。称之为ball2。

ball1与ball2的对象是否相同?不,它们是碰巧具有相同属性的不同对象。


看到这个球?它的颜色是红色的。称之为ball1。

让我们调用ball1,ball2。

ball1与ball2的对象是否相同?是。他们是同一个球。

答案 1 :(得分:36)

通过引用相等性来比较对象,并且由于object1object2是两个不同的实例,它们是不同的对象(将其视为:它们占据内存中的不同位置)。

但是如果你将object1分配给object2,它们都指向内存中的相同位置,因此是相等的(它们是对同一个单个对象的两个引用,它只在内存中存在一次)。通过object1.same = 'uiae';更改属性也会更新属性object2.same(因为它们实际上是相同的对象和相同的属性)

答案 2 :(得分:9)

var object1 ={same:'test'}
var object2 ={same:'test'};       
console.log(object1 === object2)

在这种情况下,您将创建两个不同的对象。这是因为在使用 === 运算符检查时,它在控制台中返回 false 的原因。

var object1 ={same:'test'}
var object2 =object1;
console.log(object1 === object2)

在这种情况下,您正在创建一个对象和object1& object2引用创建的对象,这是当您使用 === 运算符检查时返回true的原因。

在第二种情况下,如果我们更改object2["same"]="test2",则object1 ["相同"]值也会更改为 test2

在第一种情况下,它不会发生这种情况,因为 object1 & object2 是两个不同的对象。

参考: Object Equality in JavaScript

希望这可能会有所帮助。

答案 3 :(得分:6)

在第一种情况下,Object1和Object2是指向内存中两个不同对象的两个不同的引用点(或变量)。因此,当您检查它们是否相等时,结果为false。

在第二种情况下,您只是将参考点(地址)从Object1复制到Object2,这意味着两个参考点现在都在内存中引用相同的对象。结果为真。

始终通过引用比较对象。

答案 4 :(得分:4)

当您将对象或数组从一个变量分配给另一个变量时,它会复制对原始对象的引用,因此这两个对象是相等的。

每次你写一个对象或数组文字时,它都会产生一个不同的对象或数组,所以即使内容相似,它们也不相等。

答案 5 :(得分:3)

以这种方式创建对象后,您已创建了一个地图。 没有地图的价值,因为它不是原始类型。 所以equals只会检查参考相等性。因此失败了。 在第二种情况下,引用相等性通过。

答案 6 :(得分:3)

根据JavaScript中的定义,两个不同的对象不能彼此相等。平等的属性和值并不重要。他们有不同的指针(第一个例子)。

在第二个示例中,您将使用引用克隆对象。所以" ==="将返回真实。

答案 7 :(得分:2)

在您的第一个示例中,您创建了两个具有任意内容的不同对象,这些对象随机相同:{same:'test'}{same:'test'}

在第二个示例中,您只创建了一个对象,并将其存储在两个变量中:object1object2

===检查对象标识,这意味着比较变量中的对象必须相同。

答案 8 :(得分:2)

您的示例与== vs ===运算符差异无关。正如人们之前解释的那样,您的示例只是创建两个不同的对象,在下一个示例中引用相同的对象==和===都会在那里行为相同。

由于对象litterals总是对象litterals并且不以任何方式隐式转换,因此==和===将始终对对象litterals行为相同。其他一些类型,如NaN,null等,与==和===

比较时会得到奇怪/有趣的结果

答案 9 :(得分:0)

这是javascript处理和比较对象的方式:

enter image description here