«щільний» і «розріджений» масив
Визначення
Щільний масив (dense array)
Масив, у якому всі індекси зайняті елементами: від 0 до length - 1.
Тобто:
- немає "пропущених" індексів (дір),
- кожен індекс справді існує в об'єкті.
javascript
const dense = [10, 20, 30];Тут:
- індекси:
0, 1, 2 dense.length === 30 in dense→true,1 in dense→true,2 in dense→true
Розріджений масив (sparse array)
Масив, у якому деякі індекси відсутні: у ньому є "діри".
javascript
const sparse = [10, , 30];
console.log(sparse); // [10, <1 empty item>, 30]Тут:
- індекс
1не існує (1 in sparse→false) sparse.length === 3, але елементів насправді лише 2
Як з'являються "діри"
- При використанні
delete:
javascript
const arr = [1, 2, 3];
delete arr[1];
console.log(arr); // [1, <1 empty item>, 3]- При вказанні пропуску у літералі:
javascript
const arr = [1, , 3];- При збільшенні
lengthвручну:
javascript
const arr = [1, 2];
arr.length = 5;
console.log(arr); // [1, 2, <3 empty items>]Поведінка при переборі
| Метод | Щільний масив | Розріджений масив |
|---|---|---|
for | проходить по всіх індексах | проходить по всіх індексах |
for...of | проходить по всіх значеннях | пропускає порожні |
forEach() | проходить по кожному елементу | пропускає "порожні" |
map(), filter(), reduce() | пропускають "порожні" | |
in | перевіряє наявність індексу | поверне false для дір |
Object.keys() | покаже лише наявні індекси | пропустить порожні |
Приклад порівняння:
javascript
const dense = [1, 2, 3];
const sparse = [1, , 3];
dense.forEach(v => console.log(v)); // 1, 2, 3
sparse.forEach(v => console.log(v)); // 1, 3 (індекс 1 пропущено)
console.log(Object.keys(dense)); // ["0", "1", "2"]
console.log(Object.keys(sparse)); // ["0", "2"]Вплив на продуктивність
Розріджені масиви:
- працюють повільніше,
- гірше оптимізуються рушієм V8,
- і часто поводяться "дивно" під час ітерації.
Тому в реальних проєктах краще уникати "дірявих" масивів і використовувати
nullабоundefinedяк явні значення "порожнечі".
Коротко:
| Тип масиву | Опис | Приклад | Поведінка |
|---|---|---|---|
| Щільний | Усі індекси зайняті | [1, 2, 3] | Передбачуване, швидке |
| Розріджений | Є пропущені індекси | [1, , 3] | Методи пропускають порожні, повільніше |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.