Javascript: Object.create(null) для массивов (эквивалент Array.create(null))

Легко инициализировать объект с пустым прототипом: Object.create(null), Но у массивов нет удобного Array.create метод, как объекты. Итак, что будет массив эквивалент Object.create?

Каков наилучший способ инициализации пустого массива относительно скорости доступа * к полученному массиву? Или скорость доступа * в указанном пустом массиве будет ниже скорости доступа * регулярно? [] инициализированный массив?

Любые и все конструктивные ответы приветствуются.


* Под "скоростью доступа" подразумевается скорость считывания и записи свойств в массив.

2 ответа

Решение

Нет смысла создавать массив с пустым (или любым другим настроенным) прототипом. Вариант использования для Object.create(null) это карта 1, где ни один прототип не мешает свойствам, но у нас нет этой проблемы с массивами и их целочисленными индексами.
Если вы настаивали на этом,

Object.setPrototypeOf([], null)

достигнет этого, но создаст очень странный объект, который сломает много кода, который ожидает, что массивы будут иметь определенные методы.

Или скорость доступа к свойству в указанном пустом массиве будет ниже, чем у регулярно инициализируемого массива?

Да, вполне вероятно - странные объекты всегда имеют хорошие шансы не оптимизироваться так же, как стандартные объекты. В любом случае, это не будет быстрее.

1: Конечно, они устарели в пользу истинного Map сейчас.

Там не было бы никаких причин, чтобы просто не использовать [] для создания массива. Вы можете технически позвонить new Array(), но это буквально так же, как [],

Под капотом Array на самом деле это просто Object с числами в качестве ключей и некоторой специальной логикой для обеспечения порядка ключей (который Object технически не имеет, хотя Object как правило, поддерживает его ключевой порядок, это не гарантия).

Хотя вы могли бы технически использовать Object.create(null) чтобы создать собственную реализацию Array, он будет значительно уступать по производительности встроенному массиву Array, поскольку большинство движков будет иметь специальный код для повышения производительности.

Другие вопросы по тегам