我有一段代码可以检查数组是否相等。像这样使用它时它就像一个魅力:
[1, 2, 3].equals([1, 2, 3]); // true
[1, 2, 3].equals([1, 2, 4]); // false
当然,上面的结果是显而易见和正确的。但是,以下情况失败:
[1, 2, undefined].equals([1, 2, undefined]);
// Error: Cannot read property 'equals' of undefined
可能是什么原因造成的?我在使用它之前检查它是否具有该属性(if(this[i].equals)
),为什么它会这样说? undefined === undefined
也是真的,所以我看不出有什么问题。
函数:
Array.prototype.equals = function(arr) {
if (this.length !== arr.length) {
return false;
}
for (var i = 0; i < arr.length; i++) {
if (this[i].equals) {
if (!this[i].equals(arr[i])) {
return false;
} else {
continue;
}
}
if (this[i] !== arr[i]) {
return false;
}
}
return true;
}
最佳答案
这一行:
if (this[i].equals) {
应该是:
if (this[i] && this[i].equals) {
因此,如果 this[i]
是 undefined
,您将不会尝试访问 undefined
上的属性。
编辑: 由于您似乎在测试数组,因此进行更明确的测试会更安全,因为任何对象都可能具有 .equals
属性.
您可能想这样做:
if( Object.prototype.toString.call( this[i] ) === '[object Array]' ) {
它有点长,但会准确地检测到数组,即使它是使用 new
关键字创建的,这会抛出 typeof
运算符。
关于javascript - 数组相等性检查算法在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4978444/