Что это за сгенерированный код, предположительно (предназначенный) для выполнения?
Я видел это в автогенерированном файле javascript:
function map(x){
x={x:x};
delete x.x;
return x
}
Мое заключение заключается в том, что используется для создания объекта, но зачем его создавать таким образом? Это шаблон?
ОБНОВЛЕНИЕ
Дополнительная информация, инструмент, создавший этот код, - dart2js от Google, код используется в этом контексте:
(function (reflectionData) {
function map(x){x={x:x};delete x.x;return x}
if (!init.libraries) init.libraries = [];
if (!init.mangledNames) init.mangledNames = map();
if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
if (!init.statics) init.statics = map();
if (!init.interfaces) init.interfaces = map();
Ответы
Ответ 1
В источнике дротика есть комментарий, в котором говорится, что этот метод используется для повышения производительности v8:
// [map] returns an object literal that V8 shouldn't try to optimize with a
// hidden class. This prevents a potential performance problem where V8 tries
// to build a hidden class for an object used as a hashMap.
https://github.com/dart-lang/bleeding_edge/blob/4dde22bc006605fc168cefcc0807c43354463b6e/dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart#L17-L19
Слово map
здесь относится к ассоциативному массиву
Ответ 2
Я прочитал статью об этом некоторое время назад, и, по-видимому, если вы delete
что-то из объекта, V8 помещает объект в Режим словаря или Медленный режим, а затем свойства сохраняются в хеш-таблице ".
V8 может справляться с незначительными расхождениями, как это прекрасно, но если ваш код присваивает все виды случайных свойств объектам из одного и того же конструктора в каком-либо конкретном порядке или если вы удаляете свойства, V8 отбрасывает объект в режим словаря, где свойства хранятся в хеш-таблице. Это предотвращает выделение абсурдного числа карт.
Это статья http://www.jayconrod.com/posts/52/a-tour-of-v8-object-representation, в которой она объясняет это вместе с другими вещами.
Возможно, я ошибаюсь, но я думаю, что это используется для объектов Large (в размерах и жизни) для повышения производительности и уменьшения вероятности утечки памяти.
Это одна и та же тема
Использует ли использование эффекта ключевого слова delete v8 оптимизацию объекта?
Ответ 3
Целью функции map
является создание объекта ассоциативной карты, набор свойств которого можно быстро изменить.
Возникает естественный вопрос: не все ли объекты JavaScript по умолчанию отображаются по умолчанию? Да, они! Спецификация EMCAScript позволяет объектам добавлять или удалять свойства в любое время, что позволяет им функционировать как ассоциативные карты.
Но, увы, язык низкого уровня, отвечающий за реализацию среды исполнения JavaScript (скорее всего, С++), не так прост. В частности, V8 использует концепцию скрытые классы, в результате чего добавление свойства к объекту JavaScript приведет к создание нового класса С++. V8 делает это как оптимизацию, потому что предполагает, что ваш код будет многократно использовать небольшой набор типов объектов.
Например, у вас есть тип Bullet
с x
, y
, dx
и dy
свойствами. На практике эти типы фиксированы; вряд ли вы вдруг добавите новое свойство в объект Bullet
на лету. Оптимизация скрытого класса означает, что использование фиксированного набора типов объектов выполняется очень быстро, но это также означает, что иногда реальная стоимость добавления нового свойства в объект JS может быть довольно высокой, поскольку она побуждает к созданию новый класс С++, обладающий новым свойством.
Вводя операцию delete
на объект x
, вы сигнализируете двигателю V8, что этот объект x
не будет полезен для оптимизации скрытого класса. Идея скрытых классов заключается в том, что ваши объекты обычно не изменят свой набор свойств (кроме добавления новых свойств во время построения). Делая delete
, вы однозначно сигнализируете, что этот объект изменит свое свойство так, чтобы скрытые классы полностью бесполезны. Для этого объекта стоимость создания скрытых классов намного превышает преимущества.
Таким образом, объект, возвращаемый map
, будет исключен из оптимизаций скрытого класса V8, что позволит ему быстрее и быстрее добавлять и удалять произвольные свойства.