Назначить и сразу удалить свойство - программирование
Подтвердить что ты не робот

Назначить и сразу удалить свойство

Я не программист javascript, и я полностью озадачен тем, что делает этот код и для чего он используется:

function map(x) {
    x = Object.create(null);
    x.x = 0;
    delete x.x;
    return x;
}

Это часть того, что вы получаете при использовании компилятора dart2js.

Я не пытаюсь понять весь контекст, но то, что присваивает свойство и удаляет его непосредственно снова, помогает достичь?

Это похоже на перебор некоторых внутренних движений JS.

EDIT: в соответствии с запросом здесь полный out.js, созданный dart2js (вход - пример "Hello world!" Из Википедии): https://gist.github.com/Blutkoete/59be155b2642832e9acd383df0857d02

EDIT 2: ссылка gurvinder372 указывает, что она связана с "делегированием анонимных объектов JS для производительности", но мне, вероятно, понадобится большой опыт работы с JS, чтобы это понять.

4b9b3361

Ответ 1

Ну... Это интересная тема, и понимание этого трюка требует немного прочитать представление объекта V8-компилятора. Я не эксперт в этом, но тема была достаточно интересной, чтобы интриговать меня, чтобы найти какой-то ответ. Итак, вот что я нашел.

Прежде всего, удаление свойства, похоже, является трюком для изменения внутренней структуры того, как сохраняются и доступны свойства объекта. Другими словами, удаление свойства переключает объект в режим словаря, где свойства хранятся в хэш-карте. Поэтому, когда свойство dummy удаляется сразу же после его создания, вы получаете объект в режиме словаря.

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

Взято из этой приятной статьи. Обзор V8: представление объекта