> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/b-structured/b1-arrays/03-array-holes.md).

# 03. Array Holes

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

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

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

```javascript
> 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` - игнорирует (показывает только реальные индексы)
