[英]Empty array does not equal itself in Javascript?
我遇到了[] == []
在 Javascript 中为false
的情况。
有人可以解释为什么吗?
对象按引用相等, []
是新对象有新引用,右手的[]
也是新对象有新引用,所以它们不相等,就像:
var user1 = new User();
var user2 = new User();
user1 === user2; // Never true
考虑以下两种情况:
[] == []; // returns false
["foo"] == ["foo"]; // returns false
在这里,创建了两个不同的对象,并且在不同的内存位置创建的这两个不同的实例永远不会相同(对象实例比较比较内存地址) 。 结果输出false
。
但,
["foo"] == "foo"; // returns true
在这里, ["foo"]
对象类型被隐式转换为primitive type
。 现在右侧的"foo"
是string
,因此它尝试将其转换为string
( .toString(), since double equals allows coercion
)并比较"foo" == "foo"
,这是true
。
结论:我们通过内存指针/地址或者我们可以说引用来比较对象实例,通过实际值比较来比较原始类型。
因为它们不是同一个对象,不同的对象永远不会完全相同,所以结果是false
。
请参阅对象标识,因为两个数组都创建了一个新的数组实例,因此比较两个不同的对象是不相等的。 您的代码相当于:
var arr1 = [],
arr2 = [];
arr1 == arr2; // false
两个文字总是评估为两个不同的实例,它们不被认为是相等的。
我实际上在任何地方都找不到测试对象是否是长度数组(例如空数组)的代码,所以如果有人以后想要的话,我很快就写了它:
function isArrayOfLength(obj, length) {
var isArrayOfSpecifiedLength = false;
if(Array.isArray(obj)){
if(obj.length === length){
isArrayOfSpecifiedLength = true;
}
}
return isArrayOfSpecifiedLength;
}
以及对它的测试:
(function(){
var isValidArray = isArrayOfLength([], 0);
console.log(isValidArray); //true
})();
(function(){
var isValidArray = isArrayOfLength([1,2,3], 0);
console.log(isValidArray); //false
})();
(function(){
var isValidArray = isArrayOfLength([1,2,3], 3);
console.log(isValidArray); //true
})();
(function(){
var isValidArray = isArrayOfLength({notAnArray:true}, 0);
console.log(isValidArray); //false
})();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.