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, поскольку большинство движков будет иметь специальный код для повышения производительности.