Javascript - что происходит, когда я создаю элемент в массиве - PullRequest
2 голосов
/ 07 апреля 2020

Я могу вставить значение по произвольному индексу за пределы массива следующим образом.

> const a = []
undefined
> a[999] = true
true
> a
[ <999 empty items>, true ]

Я подозреваю, что v8 не создает 999 пустых элементов под капотом, и массивы работают больше как объекты, и вместо этого мы создаем скрытый класс, который имеет один ключ, который является ключом 999 со смещением 0. Это правильно?

1 Ответ

1 голос
/ 07 апреля 2020

С https://v8.dev/blog/fast-properties

Массивы [] и объекты {} являются объектами JSO.

Разница в том, что элементы, индексированные массивом, заполняют хранилище elements. Добавление индексированных свойств массива не создает новый HiddenClass.

В таких малонаселенных массивах, как arr[9999] = 'foo' v8 создает «пользовательский дескриптор» в «режиме словаря», чтобы избежать потери памяти при создании 10 тыс. Пустых записей. Операции с массивами в режиме словаря будут значительно медленнее, чем непрерывные массивы.

...