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

Я видел это в автоматически сгенерированном файле 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();

person user2070369    schedule 03.10.2013    source источник
comment
попробуй сам. это не так сложно   -  person karthikr    schedule 03.10.2013
comment
Я сделал, он создает пустой объект.   -  person user2070369    schedule 03.10.2013
comment
И если да, то что не просто return {};??? Или var x={}; return x;, если в первом есть какая-то синтаксическая тонкость?   -  person Lawrence Dol    schedule 03.10.2013
comment
По сути, это создание сопоставления {key: key} и удаление key и возврат пустого объекта словаря. не хуже function map(x): return {}   -  person karthikr    schedule 03.10.2013
comment
Конечно, это может быть просто случай леммингового программирования.   -  person Lawrence Dol    schedule 03.10.2013
comment
Откуда это взялось? Это больше похоже на головоломку с кодом, чем на то, что вы действительно увидите в реальной библиотеке — например, в викторине по javascript или что-то в этом роде.   -  person Joe Enos    schedule 03.10.2013
comment
Выглядит действительно глупо для меня.   -  person ChaosPandion    schedule 03.10.2013
comment
Если он сгенерирован автоматически, возможно, генератор просто недостаточно сложен, чтобы использовать другой шаблон для тривиального случая.   -  person JJJ    schedule 03.10.2013
comment
Автоматически сгенерированный код имеет тенденцию время от времени иметь мало смысла на многих разных языках. Я видел кучу подобного дерьма. Вот некоторые автоматически сгенерированные гениальные идеи из кодовой базы Java. if(true == true), {String result = ""; return null;}, catch(Exception ex){ throw new Exception(null);}. Не говоря уже о методах длиной в несколько сотен строк, которые буквально ничего не делают, кроме случайного сбоя.   -  person toniedzwiedz    schedule 03.10.2013
comment
Как получить репутацию при переполнении стека: опубликуйте простой ответ, который выглядит правильно. Неважно, ответит ли он на вопрос, плюсы все равно будут.   -  person Sam I am says Reinstate Monica    schedule 03.10.2013
comment
Сгенерировано автоматически или нет, это выглядит глупо, по крайней мере, для меня. Я не вижу нетривиального случая, когда это могло бы сделать что-то полезное.   -  person Lawrence Dol    schedule 03.10.2013
comment
Какой генератор использовался для этого? Я подозреваю, что он, вероятно, предназначен для поддержки старых версий браузеров, где литерал {} мог вызвать проблемы.   -  person SheetJS    schedule 03.10.2013
comment
Этот вопрос был американскими горками голосов. Обратите внимание, что в заголовке вопроса указано, что должен делать код (а не почему). Лично я хотел бы знать, что сгенерировало код, это единственный способ правильно ответить на вопрос.   -  person Daniel Imms    schedule 03.10.2013
comment
@Software, мне какое-то время было интересно, почему функция называется map(), но принимает только один аргумент. Для сопоставления требуется как минимум два аргумента, и this также не используется, поэтому я думаю, что функция должна принимать более одного аргумента и в этих условиях будет генерировать более понятный код.   -  person Frédéric Hamidi    schedule 03.10.2013
comment
Учитывая, что на этот вопрос нельзя ответить (из-за недостаточного контекста - и в результате увидеть отрицательные голоса ниже), я считаю, что его следует закрыть.   -  person JasCav    schedule 03.10.2013
comment
@Nirk Но почему функция должна называться map, которая принимает бесполезный аргумент?   -  person ComFreek    schedule 03.10.2013
comment
В исходном коде дротика есть комментарий, в котором говорится, что этот метод используется для повышения производительности v8: /compiler/implementation/js_emitter/reflection_data_parser.dart#L17-L19" rel="nofollow noreferrer">github.com/dart-lang/bleeding_edge/blob/   -  person SheetJS    schedule 04.10.2013
comment
@ComFreek в контексте, карта на самом деле является ассоциативной картой   -  person SheetJS    schedule 04.10.2013
comment
@Nirk, так ты имеешь в виду, что x всегда должен быть undefined при вызовах map()... Ваши комментарии являются ответом и должны быть опубликованы как таковые. Проголосовали за открытие.   -  person Frédéric Hamidi    schedule 05.10.2013
comment
Согласно комментарию @Nirk: вот видео о скрытых классах от Google I/O 2012.   -  person apsillers    schedule 08.10.2013


Ответы (3)


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

person SheetJS    schedule 08.10.2013

Недавно я читал об этом статью, и, по-видимому, если вы delete извлекаете что-то из объекта, V8 переводит объект в режим словаря или медленный режим а затем свойства сохраняются в "хеш-таблице".

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

Это статья http://www.jayconrod.com/posts/52/a-tour-of-v8-object-representation это объясняет это там наряду с другими вещами.

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

Это из той же темы

Влияет ли использование ключевого слова delete на оптимизацию объекта v8?

person iConnor    schedule 08.10.2013

Функция map предназначена для создания объекта ассоциативной карты, набор свойств которого можно быстро изменить.

Возникает естественный вопрос: разве не все объекты JavaScript уже отображаются по умолчанию? Да, это так! Спецификация EMCAScript позволяет объектам добавлять или удалять свойства в любое время, позволяя им функционировать как ассоциативные карты.

Но, увы, низкоуровневый язык, отвечающий за реализацию среды выполнения JavaScript (вероятно, C++), не так прост. В частности, в V8 используется концепция под названием скрытые классы< /em>, при этом добавление свойства к объекту JavaScript приведет к созданию нового класса C++. V8 делает это как оптимизацию, поскольку предполагает, что ваш код будет многократно использовать небольшой набор типов объектов.

Например, у вас есть тип Bullet со свойствами x, y, dx и dy. На практике эти типы фиксированы; маловероятно, что вы внезапно добавите новое свойство к объекту Bullet на лету. Оптимизация скрытого класса означает, что использование фиксированного набора типов объектов выполняется очень быстро, но это также означает, что иногда реальная стоимость добавления нового свойства к объекту JS может быть довольно высокой, поскольку это побуждает к созданию новый класс C++ с новым свойством.

Вводя операцию delete в объект x, вы сигнализируете движку V8, что этот объект x не выиграет от оптимизации скрытого класса. Идея скрытых классов заключается в том, что ваши объекты обычно не меняют свой набор свойств (за исключением добавления новых свойств во время создания). Выполняя delete, вы недвусмысленно сигнализируете, что этот объект изменит свой набор свойств таким образом, что скрытые классы станут совершенно бесполезными. Для этого объекта стоимость создания скрытых классов намного превышает выгоды.

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

person apsillers    schedule 08.10.2013
comment
Очень интересное объяснение, спасибо :) - person iConnor; 08.10.2013