Возможный дубликат:
Являются ли массивы Javascript разреженными?
Я изучаю JavaScript на данный момент и читаю несколько простых введений и руководств. Когда я смотрел на объект Array, я наткнулся на некоторые подробности, которые поразили меня как очень странное, исходя из других языков, таких как C/Java/ Scala/...
Итак, давайте предположим, что мы определяем массив как таковой:
var arr = ['foo','bar','qux']
Теперь мы присваиваем
arr[5] = 'baz'
что приводит к тому, что наш массив выглядит следующим образом:
arr
>> ["foo", "bar", "qux", undefined, undefined, "baz"]
И длина как ожидалось
arr.length
>> 6
JavaScript любезно расширил наш массив до необходимой длины - шесть, а новые элементы установлены на undefined - за исключением того, на которое мы действительно присвоили значение.
С точки зрения низкого уровня это ужасно по памяти. Обычно массив будет представлять собой непрерывный диапазон в памяти, что делает массив более крупным, как правило, включает в себя копирование всего массива в новую ячейку памяти, достаточную по размеру. Это очень дорогостоящая операция.
Теперь я понимаю, что это, скорее всего, не, что делают движки JavaScript, поскольку копирование вокруг массивов будет сумасшедшим, а пространство памяти будет потрачено впустую на все эти значения undefined.
Может кто-нибудь сказать мне, что на самом деле происходит за дверью?
- Являются ли массивы фактически связанными списками со списком?
- Являются ли элементы массива 'undefined' на самом деле?
- Как дорого работать с большими массивами, которые в основном заполнены "undefined"?