Я хочу понять, почему разница в производительности, когда обе делают то же самое?
Я хочу понять, почему разница в производительности, когда обе делают то же самое?
Производительность {} можно объяснить следующим образом:
Литералы объектов {} выполняются быстрее из-за механизма управления областью в Javascript
Когда выполняется JavaScript-код, создается контекст выполнения. Контекст выполнения (также иногда называемый областью) определяет среду, в которой должен выполняться код.
Глобальный контекст выполнения создается при загрузке страницы, и при выполнении функций создаются дополнительные контексты выполнения, в конечном итоге создаются стеки контекста выполнения, где самый верхний контекст является активным.
Каждый контекст выполнения имеет связанную с ним цепочку областей видимости, которая используется для разрешения идентификатора. Целевая цепочка содержит один или несколько переменных объектов, которые определяют идентификаторы в области видимости для контекста выполнения.
Глобальный контекст выполнения имеет только один объект переменной в своей цепочке областей видимости, и этот объект определяет все глобальные переменные и функции, доступные в JavaScript.
Когда функция создается (но не выполняется), ее внутреннему свойству [[Область]] присваивается, чтобы содержать цепочку областей видимости выполнения, в которой она была создана (внутренние свойства не могут быть доступны через JavaScript, поэтому вы не можете доступ к этому свойству напрямую).
Позже, когда выполнение втекает в функцию, объект активации создается и инициализируется значениями для этого, аргументами, именованными аргументами и любыми переменными, локальными для функции. Объект активации появляется сначала в цепочке видимости контекста выполнения, за которым следуют объекты, содержащиеся в свойстве функций [[Scope]].
При выполнении кода идентификаторы, такие как имена переменных и функций, разрешаются путем поиска в цепочке областей видимости выполнения.
Разрешение идентификатора начинается в начале цепочки областей видимости и продолжается в направлении назад. Рассмотрим следующий код:
function Add(n1, n2) {
this.n1 = n1;
this.n2 = n2;
this.val = this.n1 + this.n2;
}
var result = new Add(5, 10);
Когда этот код выполняется, функция добавления имеет свойство [[Scope]], которое содержит только объект глобальной переменной.
По мере того, как выполнение переходит в функцию добавления, создается новый контекст выполнения, а объект активации, содержащий это, аргументы n1 и n2 помещается в цепочку областей видимости.
Ниже "Связь между контекстом выполнения и цепочкой областей видимости" иллюстрируется взаимосвязь объектов за кадром, возникающих во время выполнения функции добавления.
Внутри функции добавления идентификаторы num1 и num2 должны быть разрешены при выполнении функции.
Это разрешение выполняется путем проверки каждого объекта в цепочке областей действия до тех пор, пока не будет найден конкретный идентификатор.
Поиск начинается с первого объекта в цепочке областей видимости, который является объектом активации, содержащим локальные переменные для функции.
Если идентификатор не найден там, следующий объект в цепочке видимости проверяется для идентификатора. Когда идентификатор найден, поиск останавливается.
В этом примере идентификаторы num1 и num2 существуют в локальном объекте активации, поэтому поиск никогда не переходит к глобальному объекту.
Взаимодействие с областями и управление цепочкой видимости в JavaScript важно, поскольку производительность разрешения идентификатора напрямую связана с количеством объектов для поиска в цепочке областей видимости.
Чем дальше цепочка областей действия существует идентификатор, тем длиннее поиск продолжается, и чем дольше это требуется для доступа к этой переменной; если управление областями выполняется правильно, они могут негативно повлиять на время выполнения вашего script.
Как говорят MDN
Вы используете литералы для представления значений в JavaScript. Это фиксированные значения, а не переменные, которые вы в буквальном смысле предоставляете в script.
Поэтому, когда вы вызываете new Object()
, вы вызываете функцию для создания объекта, но когда вы используете литерал, у вас уже есть фиксированный объект