比较 中的对象;JavaScript

比较 中的对象;JavaScript,javascript,Javascript,我有以下代码: var object1 = {same:'test'} var object2 = {same:'test'}; console.log(object1 === object2) var object1 = {same:'test'} var object2 = object1; console.log(object1 === object2) 它在控制台中返回false 我还有以下代码: var object1 = {same:'test'} var ob

我有以下代码:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)
var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  
它在控制台中返回false

我还有以下代码:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)
var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  
它在控制台中返回true

我知道“==”是一个相等运算符,但我不知道它在对象上是如何工作的


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

对象通过引用等式进行比较,由于
object1
object2
是两个不同的实例,它们是不同的对象(可以这样认为:它们在内存中占据不同的位置)


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

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


每次编写对象或数组文字时,它都会生成不同的对象或数组,因此即使内容相似,它们也不相等。

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

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


对象总是通过引用进行比较。

以这种方式创建对象时,即创建了地图。 没有什么比映射的值更像它不是基元类型。 所以equals只是检查引用等式。因此,这是失败的。
在第二种情况下,引用等式通过。

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

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


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

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

在第二个示例中,您正在克隆带有引用的对象。所以“==”将返回true

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[“same”]值也将更改为test2

在第一种情况下,它不会这样发生,因为object1object2是两个不同的对象

请参阅:


希望这可能会有所帮助。

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


由于对象literals始终是对象literals,并且不以任何方式隐式转换,==和===将始终对对象literals起相同的作用。其他一些类型,如NaN、null等,当与==和===

比较时,会得到奇怪/有趣的结果看到这个球了吗?它的颜色是红色的。可以这样说


看到这个球了吗?它的颜色是红色的。叫它ball2

ball1和ball2是同一个对象吗?不,它们是恰好具有相同属性的不同对象



看到这个球了吗?它的颜色是红色的。可以这样说

让我们打电话给ball1,ball2


ball1和ball2是同一个对象吗?对它们是同一个球。

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


对象总是按引用进行比较,而不是相等删除不正确的“重复”标志。@NiettheDarkAbsol不正确的重复标志?有很多类似的问题(例如,这一个,也被标记为重复:)这一个有什么区别?好吧,这不是同一个问题。在您的链接中,OP询问“我知道‘如果两个对象指向完全相同的对象,那么它们是相等的’,但是有没有其他方法来检查它??”。然而在这篇文章中,OP不知道“如果两个对象引用的是完全相同的对象,那么它们是相等的”,这就是他所问的。如果你想再举一个例子,这是完全相同的问题:
=
也返回false。在浏览器控制台中尝试:
({x:'a'}=={x:'a'})
==
操作符之间的区别在于前者执行类型强制,而后者执行严格的比较(类型和值;对象的值恰好是它们的引用)JavaScript中是否有预定义的内容,要检查对象是否相等?未预定义任何内容。您可以找到一些用户编写的函数来检查这一点。一个简单的解决方法(忽略函数并在不同顺序的字段上中断)是用JSON字符串化两个对象,然后比较结果字符串。+1,因为这是唯一包含单词identity的答案。很好的类比。还要考虑一下如果我们决定把BAR2绿色画出来,BAL1会发生什么。很好的类比(我完全偷了它):+ 1。解释我如何提问“这两个球的外观和行为是否相同?”的加分适用于许多语言。不仅仅是java脚本。此帖子应添加到堆栈中