Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:为什么两个对象不相等?_Javascript_Object_Equality - Fatal编程技术网

Javascript:为什么两个对象不相等?

Javascript:为什么两个对象不相等?,javascript,object,equality,Javascript,Object,Equality,我知道在这方面也有类似的问题,但没有一个能提供我想要的答案 在JavaScript中,如果执行以下操作,结果将为false: 我知道这与规范中如何定义JavaScript有关,但为什么会这样?这是违反直觉的 如果(“string”==“string”)结果为true,那么为什么({}=={})结果为true 我在某个地方看到等式算法的设计类似于C++或C语言,但这就像发明一种全新的引擎,它使用1/第十的燃料,而不是纯粹为了与其他汽车的使用而使用它。 为什么JavaScript是这样定义的?这个

我知道在这方面也有类似的问题,但没有一个能提供我想要的答案

在JavaScript中,如果执行以下操作,结果将为false:

我知道这与规范中如何定义JavaScript有关,但为什么会这样?这是违反直觉的

如果
(“string”==“string”)
结果为
true
,那么为什么
({}=={})结果为true

我在某个地方看到等式算法的设计类似于C++或C语言,但这就像发明一种全新的引擎,它使用1/第十的燃料,而不是纯粹为了与其他汽车的使用而使用它。


为什么JavaScript是这样定义的?这个决定背后有什么原因吗?或者它只是被看到在做某件事吗?

字符串是不可变的,因此具有相同内容的两个字符串在功能上是不可区分的

但是对象和数组是可以修改的,所以在某个特定的时间恰好有相同的内容并不意味着它们是相同的。你可以修改它们,然后它们就不同了


另一种说法是,如果
obj1==obj2
为真,那么当您执行
obj1.x=1
时,它也将更改
obj2.x

{/code>是在javascript中创建对象的文本。那是你可以替代的

var obj = new Object();

因此,每当您使用
{}
时,您都在创建一个新对象

您提到的行,
{}={}
创建了两个不同的对象,并且都没有属性。同样,它们是相同的,比如如果您有一个比较obj1和obj2属性的
equals(obj1,obj2)
方法,并且如果这两个属性的所有值都相同,则应该返回true

=
运算符将不检查属性。它检查两个对象是否指向同一个对象/引用。

鉴于

var obj1 = {};
obj2 = obj1;
console.log(obj2 == obj1); //returns true
返回true,因为obj1和obj2指向同一引用


最后,关于字符串
“abc”==“abc”
,这里的
=
操作符查找实际的字符串内容,并基于它返回真/假。

因为javascript中的字符串即使是对象也被视为一个原语,就像整数或布尔值一样,并且总是按值进行比较,因为这就是原语,一个简单的原子值。。所以
“string”==“string”
1=1
true==true

但是对象是复杂的类型,它们是原语的聚合,比较该聚合的规则不能简化为标准,即
{name:'a',address:'b',phone:'c'}={name:'a',address:'b'}
因为没有相同数量的属性?那么在这种情况下,
{name:'x',address:'y'}=={name:'a',address'b'}
?它们具有相同的属性,但具有不同的值,或者使其更复杂
{name:'x',address'y'}=={address:'y',name:'c'}
。。顺序重要吗

因此,如果不能以简单的标准方式比较复杂对象,最好让程序员实现适用于这种情况的规则

那么,语言能够实现什么样的比较,至少是有用和可靠的呢。。比较两个对象引用是否相等,这将允许进行验证,如
obj==null
obj==this
obja==objb
,这样我们至少可以知道我们在谈论什么对象/引用


所以,在概要中,原语总是被它们的值进行比较,复杂类型通过它们的引用来比较,这就是大多数语言的用法,而不是C++的灵感,或者任何东西都只是“游戏规则”< /P>它们不相等,因为它们不是同一个对象。这就是为对象定义相等的方式。你会对物体的平等性提出什么其他定义?为什么?好的,我明白了。我总是觉得在检查相等性时,变量所持有的基本值是比较的值。也许你的意思是

obj1=obj2
不是
obj1==obj2
@RubenYeghikyan不,我的意思是如果它们相等,那么改变一个会改变另一个。我明白了,这会让事情变得更清楚一些。谢谢你抽出时间。
var obj1 = {};
obj2 = obj1;
console.log(obj2 == obj1); //returns true