Может ли JavaScript оптимизировать этот объект?

Представьте, что мы определяем новый объект следующим образом:

const foo = {number1: 1, number2: 2}

Это должно определить новый «скрытый класс» с этими двумя свойствами.

Теперь представьте, что я определяю новый класс, используя синтаксис класса ES6.

class Numbers {
  constructor() {
    this.number1 = 1
    this.number2 = 2
  }
}

и я создаю из него новый объект.

const bar = new Numbers()

Теперь вопрос: будет ли «скрытый класс» bar таким же, как «скрытый класс» foo?

Поскольку я предполагаю, что происходит то, что первое определение создаст новый «скрытый класс» с двумя свойствами, но второе создаст новый «скрытый класс», затем он создаст новый «скрытый класс» с одним свойством, а затем создаст еще один «Скрытый класс» с еще одним свойством, в результате которого три «скрытых класса» связаны вместе.

Кто-нибудь может это прояснить? Если мои предположения верны, то новый «синтаксис класса ES6» действительно медленнее.

По материалам статьи: Основы движка JavaScript: фигуры и встроенные кеши · Матиас Биненс

Нет, он говорит об оптимизации движка JS.

Ryan Searle 22.06.2018 17:01

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

dgeare 22.06.2018 17:09

Некоторые случайные предположения: foo и Numbers будут иметь разные скрытые классы, поскольку их прототип отличается. Кроме того, я предполагаю, что конструктор будет сильно оптимизирован, в результате чего в конце будет использоваться только один скрытый класс, поэтому классы совсем не медленнее по сравнению с функциями конструктора, а разница с литералами объекта очень мала.

Jonas Wilms 22.06.2018 17:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
3
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Now the question: Is the "Hidden Class" of the bar going to be the same as the Hidden Class of foo?

Нет. foo создаст такой скрытый класс (псевдокод):

{ number1: Number, number2: Number }

Однако конструкция bar создаст три скрытых класса, сначала пустой:

{}

Затем будет назначено первое свойство, которое расширяет существующий скрытый класс:

 { number1: Number } -> {}

После второго задания он снова будет расширен:

{ number2: Number } -> { number1: Number } -> {}

Таким образом, на самом деле скрытый класс не равен скрытому классу foo, поскольку он разделен на несколько скрытых классов, расширяющих друг друга.

If my assumptions are right then the new "ES6 class syntax" is indeed slower.

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

Читать дальше

Другие вопросы по теме