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