Подтвердить что ты не робот

Javascript: {} vs новая функция Object()

Я хочу понять, почему разница в производительности, когда обе делают то же самое?

enter image description here

Контрольная таблица

4b9b3361

Ответ 1

Производительность {} можно объяснить следующим образом:

  • {} является литералом для объекта в Javascript, а литералы оцениваются быстрее.
  • В качестве дополнительного бонуса литералы занимают меньше места в вашем коде, поэтому общий размер файла - меньше.
  • Конечный результат литерального кода совпадает с новым кодом Object(), но он выполняется быстрее почти во всех браузерах (Firefox 3.5 практически не отличается).
  • По мере увеличения количества свойств объекта и элементов массива также полезно использовать литералы.

Литералы объектов {} выполняются быстрее из-за механизма управления областью в 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 помещается в цепочку областей видимости.

Ниже "Связь между контекстом выполнения и цепочкой областей видимости" иллюстрируется взаимосвязь объектов за кадром, возникающих во время выполнения функции добавления.

enter image description here

Внутри функции добавления идентификаторы num1 и num2 должны быть разрешены при выполнении функции.

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

Поиск начинается с первого объекта в цепочке областей видимости, который является объектом активации, содержащим локальные переменные для функции.

Если идентификатор не найден там, следующий объект в цепочке видимости проверяется для идентификатора. Когда идентификатор найден, поиск останавливается.

В этом примере идентификаторы num1 и num2 существуют в локальном объекте активации, поэтому поиск никогда не переходит к глобальному объекту.

Взаимодействие с областями и управление цепочкой видимости в JavaScript важно, поскольку производительность разрешения идентификатора напрямую связана с количеством объектов для поиска в цепочке областей видимости.

Чем дальше цепочка областей действия существует идентификатор, тем длиннее поиск продолжается, и чем дольше это требуется для доступа к этой переменной; если управление областями выполняется правильно, они могут негативно повлиять на время выполнения вашего script.

Ответ 2

Как говорят MDN

Вы используете литералы для представления значений в JavaScript. Это фиксированные значения, а не переменные, которые вы в буквальном смысле предоставляете в script.

Поэтому, когда вы вызываете new Object(), вы вызываете функцию для создания объекта, но когда вы используете литерал, у вас уже есть фиксированный объект