我知道SO上有类似的问题,但没有一个能提供我想要的答案。
在JavaScript中,如果执行以下操作,结果将为false:
我知道这与规范中如何定义JavaScript有关,但为什么会这样呢?这是违反直觉的。
如果("string" === "string")
导致true
,那么为什么({ } === { })
导致无效?
我在某处看到,相等算法的设计与C ++或C#相似,但这就像发明了一种全新的引擎,它使用了十分之一的燃料,并没有纯粹用于与其他车。
为什么JavaScript以这种方式定义?这个决定背后有原因吗?或者只是因为它看到做完成的事情?
答案 0 :(得分:6)
{}
是在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。
答案 1 :(得分:3)
字符串是不可变的,因此具有相同内容的两个字符串在功能上无法区分。
但是可以修改对象和数组,因为它们碰巧在某个特定时间具有相同的内容并不意味着它们是相同的。你可以修改它们,然后它们会有所不同。
另一种方法是,如果obj1 == obj2
为真,那么当您执行obj1.x = 1
时,它也会更改obj2.x
。
答案 2 :(得分:1)
因为javascript中的字符串即使是一个对象也被认为是一个原语,就像一个整数或一个布尔值,并且总是按值进行比较,因为这就是一个原语,一个简单的原子值..所以{ {1}},"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
等验证所以我们至少可以知道我们在讨论什么对象/参考。
所以总结原语总是会按它们的价值进行比较,而复杂的类型会通过它们的参考进行比较,这就是大多数语言的作用,而不是c ++的灵感或其他只是“游戏规则”的灵感