03. Array Holes

Элемент со значением undefined и отсутствующий элемент -- это разные вещи, хотя и очень похожие. При попытке обратиться по индексу к дыре, будет получено значение undefined. Ключа для таких элементов в массиве не существует. Определить есть ли дыра можно проверив наличие индекса в массиве а не элемента по индексу при помощи оператора in:

> const a = [,,2];
> a[0]
undefined
> 0 in a
false
1 in a
false
2 in a
true

В ES6 (в функциях и в итераторе) дыры в массивах трактуются как неопределенные элементы со значением undefined.

> Array.from(['a',,'b'])
[ 'a', undefined, 'b' ]
> [,'a'].findIndex(x => x === undefined)
0
> [...[,'a'].entries()]
[ [ 0, undefined ], [ 1, 'a' ] ]

Некоторые операции "видят" дыры в массиве, а некоторые игнорируют их:

  • forEach - игнорирует

  • every - игнорирует

  • map - игнорирует при вызове функции, но сохраняет в массиве

  • filter - удаляет из массива

  • join - преобразует дыры в значение undefined

  • sort - сохраняет

  • for..in - игнорирует (показывает только реальные индексы)

Last updated