Будет ли результат в Object.assign в режиме словаря, если я использую объекты в медленном режиме? - PullRequest
0 голосов
/ 16 января 2019

если у меня есть объект, который находится в «медленном режиме» или режиме словаря, при использовании Object.assign результат будет в быстром режиме?

пример:

const foo = {'first': 1, 'second': 2}; // fast mode
delete foo.first; // puts foo in slow mode

const bar = Object.assign({}, foo);// will object bar be in slow mode?

1 Ответ

0 голосов
/ 17 января 2019

(здесь разработчик V8.) Краткий ответ: в этом примере bar имеет "быстрые" свойства.

Вы можете убедиться в этом сами, запустив d8 (или узел) с флагом --allow-natives-syntax, а затем используя специальную функцию %HasFastProperties(bar).

Тем не менее, это внутренняя деталь реализации, которая может со временем измениться. Это не должно быть то, что ваш код должен иметь причины для заботы.

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

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

(Если бы это было так же просто, как иметь «хороший случай» и «плохой случай», то V8 было бы глупо вообще иметь «плохой случай», и вы бы хотели флаг --always-good-case ( или просто --dont-be-silly), верно? ;-) Реальность такова, что это компромисс: "хорошо для одной вещи" против "хорошо для другой вещи".)

...