У меня есть пользователь, который генерирует отчеты 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
ли 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
функцию неправильно? Нужно ли мне сначала дублировать массив, прежде чем я его прохожу?
Спасибо
-Edit
Этот тест в узле согласно примеру GMaiolo и комментарий Алексея Лебедева
// 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
}
if (item) {
не остановит вашу ошибку. Еслиitem
не имеет свойстваvalues
или имеет значениеnull
, та же ошибка