Skip to main content

«щільний» і «розріджений» масив

Визначення

Щільний масив (dense array)

Масив, у якому всі індекси зайняті елементами: від 0 до length - 1.

Тобто:

  • немає "пропущених" індексів (дір),
  • кожен індекс справді існує в об'єкті.
javascript
const dense = [10, 20, 30];

Тут:

  • індекси: 0, 1, 2
  • dense.length === 3
  • 0 in densetrue, 1 in densetrue, 2 in densetrue

Розріджений масив (sparse array)

Масив, у якому деякі індекси відсутні: у ньому є "діри".

javascript
const sparse = [10, , 30]; console.log(sparse); // [10, <1 empty item>, 30]

Тут:

  • індекс 1 не існує (1 in sparsefalse)
  • sparse.length === 3, але елементів насправді лише 2

Як з'являються "діри"

  1. При використанні delete:
javascript
const arr = [1, 2, 3]; delete arr[1]; console.log(arr); // [1, <1 empty item>, 3]
  1. При вказанні пропуску у літералі:
javascript
const arr = [1, , 3];
  1. При збільшенні 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

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.