javascript - 数组相等性检查算法在某些情况下不起作用

标签 javascript arrays algorithm

我有一段代码可以检查数组是否相等。像这样使用它时它就像一个魅力:

[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/

相关文章:

arrays - 计算列表中 k 个最大数字之和的有效方法?

c - 数组到指针的转换是否消除了间接运算符的评估?

javascript - 在 python django 中通过 url 发送数组

javascript - 将带有对象数组的 Javascript 对象提交给 API

C - 先按月然后按天对一年的数据进行排序

algorithm - 从包含 10 亿个整数的文件中显示前 100 个整数的最有效方法。内存最多可容纳 100 万个整数

javascript - 窗口位置 = "location.html";

javascript - Knockout - 具有多个模型的 foreach 循环中的函数

javascript - 如何在 javascript 中按数值对对象进行排序

javascript - JS 代码无法按预期在网络浏览器上运行