Подтвердить что ты не робот

Как JavaScript VM реализует доступ к объекту Object? Это Hashtable?

Объекты JavaScript могут использоваться как Hashtable (ключ должен быть строкой) Является ли это хорошо, как Hashtable структуры данных?

Я имею в виду, что он реализован как Hashtable позади сцены?

Обновить: (1) Я поменял HashMap на хеш-таблицу (2) Я полагаю, что большая часть браузера реализует его одинаково, если не почему? есть ли какое-либо требование, как реализовать его в спецификациях ECMAScript?

Обновление 2: я понимаю, мне просто интересно, как V8 и Firefox JS VM реализуют GetProjects/seters Object.properties?

4b9b3361

Ответ 1

V8 не реализует доступ к свойствам объектов как hashtable, он фактически реализует его более эффективным способом (производительность)

Итак, как это работает? "V8 не использует динамический поиск для доступа к свойствам. Вместо этого V8 динамически создает скрытые классы за кулисами" - это делает доступ к свойствам почти так же быстро, как доступ к свойствам объектов С++.

Почему? потому что в фиксированном классе каждое свойство может быть найдено в определенном фиксированном местоположении смещения.

Таким образом, общий доступ к свойству объекта в V8 выполняется быстрее, чем Hashtable..

Я не уверен, как это работает на других виртуальных машинах.

Дополнительную информацию можно найти здесь: https://developers.google.com/v8/design#prop_access

Вы также можете прочитать больше о Hashtable в JS здесь: (мой блог) http://simplenotions.wordpress.com/2011/07/05/javascript-hashtable/

Ответ 2

"Я предполагаю, что большая часть браузера реализует его одно и то же, если нет, то почему нет? существует ли какое-либо требование, как реализовать его в спецификациях ECMAScript?"

Я не эксперт, но я не могу придумать какой-либо причины, по которой спецификация языка подробно описала бы, как ее функции должны быть реализованы внутри страны. Такое ограничение не имеет абсолютно никакой цели, поскольку оно не влияет на функционирование языка каким-либо образом, кроме производительности.

edit - несмотря на два downvotes, на самом деле это абсолютно правильно, и на самом деле независимость реализации спецификации ECMA-262 специально описана в раздел 8.6.2 спецификации:

"В описаниях этих таблиц указано их поведение для Объекты ECMAScript, если в этом документе не указано иное для отдельных видов собственных объектов ECMAScript. Объекты хоста могут поддерживать эти внутренние свойства с любым зависящим от реализации поведением, если оно согласуется с конкретными ограничениями объекта-объекта, указанными в этом документе "

"Хост-объекты могут реализовывать эти внутренние методы любым способом, если не указано иное;"

Слово "хэш" нигде не отображается во всей спецификации ECMA-262.

(оригинал, продолжение)

Реализации Javascscript, скажем, Internet Explorer 6.0 и Google Chrome V8 практически не имеют ничего общего, но (более или менее) оба соответствуют одной и той же спецификации.

Если вы хотите знать, как какой-то конкретный интерпретатор javascript что-то делает, вы должны изучить этот движок специально.

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

В конце дня все, что вам нужно знать, это они работают. Могут быть более быстрые способы создания таблиц поиска больших наборов с использованием ajax или даже в памяти. Например, посмотрите интересное обсуждение этого сообщения из блога Джона Ресейга об использовании структуры данных trie.

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

Ответ 3

В этой статье объясняется, как они реализованы в V8, движке, используемом Node.js и большинстве версий Google Chrome.

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

по-видимому, "тактика" может меняться со временем, в зависимости от количества свойств, переходя от массива именованных значений к словарю.

v8 также принимает во внимание тип, число или строка не будут обрабатываться так же, как объект (или функция, тип объекта)

если я правильно понимаю, доступ к свойству часто, например, в цикле, будет кэшироваться.

v8 оптимизирует код на лету, наблюдая за тем, что он на самом деле делает и как часто

v8 идентифицирует объекты с одинаковым набором именованных свойств, добавленных в том же порядке (как это сделал бы конструктор класса, или повторяющийся бит JSON), и обрабатывает их таким же образом.

см. статью для получения более подробной информации, а затем подать заявку в Google на работу :)