Рубрики
Без рубрики

Редкие массивы VS густые массивы в JavaScript – объяснены примерами

У меня недавно у меня был действительно интересный ошибок, на первый взгляд, совершенно тупой. Я видел, что у меня был массив, который был пустым. Но длина была 31. Подожди, что? Какие плотные массивы? Губые массивы – самый известный тип массива. Они

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