Автор оригинала: FreeCodeCamp Community Member.
У меня недавно у меня был действительно интересный ошибок, на первый взгляд, совершенно тупой. Я видел, что у меня был массив, который был пустым. Но длина была 31.
Чего ждать?
Что такое густые массивы?
Густые массивы являются наиболее известным типом Массив Отказ Они являются «нормальными» массивами, с которыми больше всего знакомы.
Плотный массив – это массив, в котором элементы все последовательные, начиная с индекса 0.
В этом случае свойство длины массива точно определяет количество элементов в массиве.
let array = [1, 2, 3, 4, 5] array.length // Returns 5
Что такое редкие массивы?
Редкая массив – это, в котором элементы не являются последовательными, и они не всегда начинаются с 0.
Они по сути Массив с «отверстиями» или пробелами в последовательности их показателей.
Так что пример будет:
let array = []; array[100] = "Holes now exist"; array.length // 101, but only 1 element
Обычно длина свойства Массив Точно возвращает количество элементов в массиве, но в редких массах они не. Если массив редкий, значение свойства длины больше, чем количество элементов.
Массив S под капотом в JavaScript есть Объект с. Их ключи являются цифрами, и их значения являются элементами.
let array = [];
array[20] = {};
array[100] = {};
array[19] = {};
alert(array.length); // Logs 101
Длина Недвижимость на Массив принимает индекс последнего элемента и добавляет один. Поэтому, если у вас есть массив с отверстиями между индексом 0 по 100, а элемент на индекс 101, Длина вернутся 101, так как это последний индекс + 1.
Вышескашенное происходит независимо от того, сколько элементов в Массив Отказ
SPEC конкретно детализирует это поведение, если вы Хотите прочитать больше на Ecmascript Spec здесь.
Вы уже видели некоторые пути, но есть больше:
Используйте объект массива
let array = new Array(10); // array initialized with no elements array.length // 10
Вставьте ключ/значение в определенный индекс
array[1000] = 0; // Assignment adds one element array.length // But .length returns 1001
Используйте оператор удаления
let array = [1, 2, 3, 4, 5] delete array[0] array.length // .length returns 5
Инициализировать массив с отверстиями
[,,,,] // You have created an array with nothing but holes [1,2,3,4,,5] // Oh no, you mistyped a comma and entered a hole between 4 and 5!
Различия в реализации браузера
Браузер, который вы включены (а также версии), представляет собой отверстия редких массивов по-разному.
Chrome отображает это лучшее (на мой взгляд) и показывает Пустой Отказ
Новейшая версия Firefox (80.0.1 во время бытия) показывает это так:
Заключение
Окончательное решение ошибки, которое я ввел в начале, это просто проверить, что элемент не является фальсивом, прежде чем использовать его. Что-то вроде:
let array = [,,,,]
for(let i = 0; i < array.length; i++){
if (array[i]) {
console.log(array[i])
}
}
Потому что дыры лояльны, это не будет делать логику, которую вы пытаетесь на любых отверстиях, которые у вас есть в Массив Отказ
Так почему мой браузер покажет это пустым?
Я использовал Safari, и он ничего не показал для дыр. Поэтому я вышли из Массив Длина, которая составляла 31, и когда я высунул содержимое, он только что показал мне пустой массив! Довольно запутанно на первый взгляд.