Что это за сгенерированный код, предположительно (предназначенный) для выполнения?

Я видел это в автогенерированном файле 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, что позволит ему быстрее и быстрее добавлять и удалять произвольные свойства.