Под капотом есть хеш-таблицы объектов Javascript?

Мне было интересно, как объекты реализованы под капотом в движках Javascript (V8, Spidermonkey и т. д.). Это действительно просто хеш-таблицы? Если да, то как они обрабатывают столкновения?


person Newtang    schedule 21.04.2012    source источник
comment
См. этот ответ stackoverflow.com/a/6602088/8338   -  person Alexey Lebedev    schedule 21.04.2012


Ответы (3)


Прежде всего, ответ, вероятно, несколько отличается для разных JS-движков. Кроме того, я предполагаю, что вы конкретно спрашиваете о хранении собственности; очевидно, что объекты также имеют множество других состояний (очевидным является звено цепи прототипа).

В случае с Spidermonkey объекты в основном имеют связанный список пар (propname, информация о свойстве), пока у них не станет слишком много свойств, когда я считаю, что они все еще сохраняют связанный список (потому что на практике порядок имеет значение для свойств в JS), но добавьте внеполосную хеш-таблицу, которая сопоставляет имена свойств с записями в связанном списке.

Могут быть и другие причины перехода на хэш-таблицу; детали точно не были исправлены с течением времени и, вероятно, могут измениться в будущем.

Связанные списки и хэш-таблицы фактически являются общими для объектов; если два объекта имеют одинаковые имена свойств и соответствующую информацию о свойствах (которая НЕ включает значение для свойств с сохраненным значением) и свойства были установлены в одном и том же порядке, они могут совместно использовать связанный список свойств.

Фактические значения свойств, когда они должны быть сохранены, хранятся в массиве объекта (или, точнее, в двух массивах; один размещается внутри объекта, размер которого фиксируется во время создания объекта, другой динамически распределяется и изменяется по мере необходимости для свойств, которые добавляются позже).

person Boris Zbarsky    schedule 22.04.2012

Можно представить себе объект как ассоциативный массив (также известный как карта, словарь, хэш, таблица поиска). Ключи в этом массиве — это имена свойств объекта.

Я нашел это на MDN

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors

В JS массивы — это ассоциативные массивы, и объекты тоже одинаковы. В JS массивы — это в основном объекты со свойствами в виде порядковых номеров.

person Arsalan Adeeb    schedule 02.02.2020

Взгляните на аналогичный вопрос Как JavaScript VM реализует доступ к свойствам объекта? и мой ответ. Здесь я описал метод оптимизации, используемый движками JS, и то, как он влияет на производительность поиска ключей. Я надеюсь, что знание этих деталей позволит вам писать более эффективный код JS.

person Valeriy Katkov    schedule 28.05.2020