Автор оригинала: 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, и когда я высунул содержимое, он только что показал мне пустой массив! Довольно запутанно на первый взгляд.