Функция 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
return {};
??? Илиvar x={}; return x;
, если в первом есть какая-то синтаксическая тонкость? - person Lawrence Dol   schedule 03.10.2013{key: key}
и удалениеkey
и возврат пустого объекта словаря. не хужеfunction map(x): return {}
- person karthikr   schedule 03.10.2013if(true == true)
,{String result = ""; return null;}
,catch(Exception ex){ throw new Exception(null);}
. Не говоря уже о методах длиной в несколько сотен строк, которые буквально ничего не делают, кроме случайного сбоя. - person toniedzwiedz   schedule 03.10.2013map()
, но принимает только один аргумент. Для сопоставления требуется как минимум два аргумента, иthis
также не используется, поэтому я думаю, что функция должна принимать более одного аргумента и в этих условиях будет генерировать более понятный код. - person Frédéric Hamidi   schedule 03.10.2013map
, которая принимает бесполезный аргумент? - person ComFreek   schedule 03.10.2013x
всегда должен бытьundefined
при вызовахmap()
... Ваши комментарии являются ответом и должны быть опубликованы как таковые. Проголосовали за открытие. - person Frédéric Hamidi   schedule 05.10.2013