(здесь разработчик V8.) Краткий ответ: в этом примере bar
имеет "быстрые" свойства.
Вы можете убедиться в этом сами, запустив d8 (или узел) с флагом --allow-natives-syntax
, а затем используя специальную функцию %HasFastProperties(bar)
.
Тем не менее, это внутренняя деталь реализации, которая может со временем измениться. Это не должно быть то, что ваш код должен иметь причины для заботы.
В частности, я не знаю, поэтому ли вы спрашиваете об этом, поэтому я просто хотел бы сказать, что я настоятельно рекомендую против создания любых пользовательских помощников «форсированного режима», которые копируют объекты - по всей вероятности, будут сжигать больше времени и памяти, чем экономят, и могут внезапно прекратить делать то, что, по вашему мнению, делает, даже не зная об этом.
В целом картина такова, что «быстрые свойства» и «медленные свойства» являются неправильными. Лучшими терминами были бы «свойства для быстрого чтения» и «свойства для быстрого изменения»: причина, по которой оператор delete
(обычно) переводит объект в режим словаря, заключается в том, что добавление и удаление свойств значительно быстрее , когда объект находится в режиме словаря, чем когда он находится в (плохо названном) «режиме быстрого свойства». В большинстве случаев эвристика V8 делает довольно хорошую работу по выбору правильного внутреннего режима для ваших объектов, и вы обычно можете сосредоточиться на написании чистого кода, а не беспокоиться о внутренних компонентах движка.
(Если бы это было так же просто, как иметь «хороший случай» и «плохой случай», то V8 было бы глупо вообще иметь «плохой случай», и вы бы хотели флаг --always-good-case
( или просто --dont-be-silly
), верно? ;-) Реальность такова, что это компромисс: "хорошо для одной вещи" против "хорошо для другой вещи".)