Ответ, как обычно бывает с JavaScript, звучит так: «Это немного страннее ...»
Использование памяти не определено, и любая реализация может быть глупой. Теоретически, const a = []; a[1000000]=0;
может сжечь мегабайты памяти, как и const a = [];
. На практике даже Microsoft избегает таких реализаций.
Джастин Лав указывает, что атрибут длины является набором индексов наивысший . НО только обновляется, если индекс является целым числом.
Итак, массив редкий. НО встроенные функции, такие как redu (), Math.max () и «for ... of», будут проходить через весь диапазон возможных целочисленных индексов от 0 до длины, посещая многие из них, которые возвращают «undefined». НО «for ... in» циклы могут делать, как вы ожидаете, посещая только определенные ключи.
Вот пример использования Node.js:
"use strict";
const print = console.log;
let a = [0, 10];
// a[2] and a[3] skipped
a[4] = 40;
a[5] = undefined; // which counts towards setting the length
a[31.4] = 'ten pi'; // doesn't count towards setting the length
a['pi'] = 3.14;
print(`a.length= :${a.length}:, a = :${a}:`);
print(`Math.max(...a) = :${Math.max(a)}: because of 'undefined values'`);
for (let v of a) print(`v of a; v=:${v}:`);
for (let i in a) print(`i in a; i=:${i}: a[i]=${a[i]}`);
дает:
a.length= :6:, a = :0,10,,,40,:
Math.max(...a) = :NaN: because of 'undefined values'
v of a; v=:0:
v of a; v=:10:
v of a; v=:undefined:
v of a; v=:undefined:
v of a; v=:40:
v of a; v=:undefined:
i in a; i=:0: a[i]=0
i in a; i=:1: a[i]=10
i in a; i=:4: a[i]=40
i in a; i=:5: a[i]=undefined
i in a; i=:31.4: a[i]=ten pi
i in a; i=:pi: a[i]=3.14
Но. Есть еще несколько угловых случаев с массивами, которые еще не упомянуты.