array.some循环可以在undefined上吗?

时间:2018-06-12 16:04:00

标签: javascript

我的用户正在使用此代码生成Sentry报告Cannot read property 'values' of undefined

var self = this;
if (self.queue()) {
    return self.queue().some(function (item, index) {
        return item.values[key] == value;
    });
} else {
    return false;
}

self.queue()是一个可以观察到的淘汰赛。 这怎么可能? array.some是否循环空数组?或者是否有一些奇怪的可观察性,some函数附加到真实数组,并且数组正在被循环编辑?

显而易见的答案就是这样做

var self = this;
if (self.queue()) {
    return self.queue().some(function (item, index) {
        if (item && item.values) {
            return item.values[key] == value;
        }else{
            return false;
        }
    });
} else {
    return false;
}

但我无法理解为什么要这样做。

我使用some函数错了吗?在循环之前,我是否需要先复制数组?

由于

- 编辑

根据GMaiolo的例子和Alexey Lebedev的评论在节点中的这个测试

// let arr = [null, undefined, 0, 'something', undefined, 3]
let arr = [null, , , 'something', , 3]
console.log("test 1:");
for (const value of arr) {
    console.log(value)
}
console.log("\ntest 2:");
arr.forEach(function(item){
    console.log(item);
});
console.log("\ntest 3:");
arr.some(function(item){
    console.log(item);
    return false;
});

结果

test 1:
null
undefined
undefined
something
undefined
3

test 2:
null
something
3

test 3:
null
something
3

在节点8.11中测试

1 个答案:

答案 0 :(得分:3)

undefinednull值仍然是其位置的数组元素,因此,回答特定问题:

Array.some将遍历填充了undefined元素的数组。

话虽这么说,我们可以使用Array.values测试我刚刚说过的内容:

let arr = [null, undefined, 0, 'something', undefined, 3]
const iterator = arr.values()

for (const value of iterator) {
  console.log(value) // output: null, undefined, 0, "something", undefined, 3
}