我有一个用户从这段代码生成 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 中测试
最佳答案
undefined
或 null
值在其位置上仍然是数组的元素,因此,回答特定问题:
是,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
}
关于javascript - array.some 可以在未定义的情况下循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821478/