Мне было интересно, как объекты реализованы под капотом в движках Javascript (V8, Spidermonkey и т. д.). Это действительно просто хеш-таблицы? Если да, то как они обрабатывают столкновения?
Под капотом есть хеш-таблицы объектов Javascript?
Ответы (3)
Прежде всего, ответ, вероятно, несколько отличается для разных JS-движков. Кроме того, я предполагаю, что вы конкретно спрашиваете о хранении собственности; очевидно, что объекты также имеют множество других состояний (очевидным является звено цепи прототипа).
В случае с Spidermonkey объекты в основном имеют связанный список пар (propname, информация о свойстве), пока у них не станет слишком много свойств, когда я считаю, что они все еще сохраняют связанный список (потому что на практике порядок имеет значение для свойств в JS), но добавьте внеполосную хеш-таблицу, которая сопоставляет имена свойств с записями в связанном списке.
Могут быть и другие причины перехода на хэш-таблицу; детали точно не были исправлены с течением времени и, вероятно, могут измениться в будущем.
Связанные списки и хэш-таблицы фактически являются общими для объектов; если два объекта имеют одинаковые имена свойств и соответствующую информацию о свойствах (которая НЕ включает значение для свойств с сохраненным значением) и свойства были установлены в одном и том же порядке, они могут совместно использовать связанный список свойств.
Фактические значения свойств, когда они должны быть сохранены, хранятся в массиве объекта (или, точнее, в двух массивах; один размещается внутри объекта, размер которого фиксируется во время создания объекта, другой динамически распределяется и изменяется по мере необходимости для свойств, которые добавляются позже).
Можно представить себе объект как ассоциативный массив (также известный как карта, словарь, хэш, таблица поиска). Ключи в этом массиве — это имена свойств объекта.
Я нашел это на MDN
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors
В JS массивы — это ассоциативные массивы, и объекты тоже одинаковы. В JS массивы — это в основном объекты со свойствами в виде порядковых номеров.
Взгляните на аналогичный вопрос Как JavaScript VM реализует доступ к свойствам объекта? и мой ответ. Здесь я описал метод оптимизации, используемый движками JS, и то, как он влияет на производительность поиска ключей. Я надеюсь, что знание этих деталей позволит вам писать более эффективный код JS.