[英]Javascript: Why are two objects not equal?
{}
是在javascript中创建对象的文字。 那是你可以替换的
var obj = new Object();
同
var obj = {};
因此,只要您使用{}
就会创建一个新对象。
您提到的行{} == {}
会创建两个不同的对象,并且都没有属性。 它们是相同的,就像你有equals(obj1, obj2)
方法来比较obj1和obj2的属性一样,如果两个对所有属性都有相同的值,它应该返回true。
但是==
运算符不会检查属性。 它检查两个对象是否都指向同一个对象/引用。
而
var obj1 = {};
obj2 = obj1;
console.log(obj2 == obj1); //returns true
返回true,因为obj1和obj2指向同一个引用。
最后,关于字符串"abc" == "abc"
,这里==
运算符查找实际的字符串内容并基于它返回true / false。
字符串是不可变的,因此具有相同内容的两个字符串在功能上无法区分。
但是对象和数组可以被修改,因为它们碰巧在某个特定时间具有相同的内容并不意味着它们是相同的。 你可以修改它们,然后它们会有所不同。
另一种方法是,如果obj1 == obj2
为真,那么当你执行obj1.x = 1
,它也会改变obj2.x
因为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 ++的灵感或其他只是“游戏规则”的灵感
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.