假设Array
没有被覆盖,为什么以下比较输出错误?
[] === new Array()
> false
[] === []
> false
答案 0 :(得分:1)
您要比较两个唯一的Array对象是否有身份,而不是内容。
答案 1 :(得分:1)
对象是不同的,因为它们是不同的内存段。例如:
var a = [],
b = [];
a === b; // false
typeof a === typeof b; // true
注意:typeof语句将返回"object" not "array"。有更好的方法来确定对象是否是一个数组。但这足以解释。
答案 2 :(得分:1)
无论使用相等==
运算符还是严格相等===
运算符,如果操作数是对象,只有当两个操作数都引用相同的对象时,结果才为真
你的代码创建了两个不同的数组,都是空的,所以直观地看起来它们看起来是平等的,但这不是equals运算符的工作方式。
类似[1,2,3] === [1,2,3]
之类的东西也是假的。同样很容易认为它们应该相等,但比较是测试数组是否是相同的数组,而不是数组中的所有元素是否相等。
另一方面,如果x === y
和x
都引用同一个数组,y
将为真。
有关详细信息:https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators
答案 3 :(得分:1)
===
运算符使用strict equality comparison algorithm,其在步骤7中说明:
如果x和y引用同一个对象,则返回true。否则,返回false。
因此,如果 a 和 b 引用一个对象,那么仅当{em>一个和 b a === b >引用相同的对象(注意Arrays是Objects)。
答案 4 :(得分:0)
在JavaScript中,当您在对象上使用==
和===
时(数组只是一个对象,[]
只是语法糖),只返回true
两个操作数都指向完全相同的对象,但如果它们引用2个不同的,甚至是相同的对象则不会。
例如:
js> var x = []
js> var y = []
js> x == y
false
js> x = y
js> x == y
true
将其视为两个人谈论同一个人的区别,而两个人分别谈论两个双胞胎中的每个人。