Может ли array.some зацикливаться на неопределенном?

1

У меня есть пользователь, который генерирует отчеты 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

  • 1
    Также возможно, что массив содержит вещи, о которых вы не думаете. if (item) { не остановит вашу ошибку. Если item не имеет свойства values или имеет значение null , та же ошибка
  • 0
    Хороший вопрос, если один может случиться, другой может тоже, я буду редактировать
Теги:

1 ответ

3
Лучший ответ

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
}
  • 0
    Ну, это изменит правила игры ... приложение имеет петли везде. Спасибо за помощь.
  • 2
    но не на редких элементах.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню