javascript - JavaScript 可以优化这个对象吗?

标签 javascript performance es6-class javascript-engine

假设我们像这样定义一个新对象:

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

这应该使用这两个属性定义一个新的“隐藏类”。

现在假设我使用 ES6 类语法定义了一个新类。

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

然后我从中创建一个新对象。

const bar = new Numbers()

现在的问题是:bar 的“隐藏类”是否与 foo 的隐藏类相同?

因为我想象的是,第一个定义将创建一个具有两个属性的新“隐藏类”,而第二个定义将创建一个新的“隐藏类”,然后它将创建一个具有一个属性的新“隐藏类”然后用另一个属性创建另一个“隐藏类”,导致三个“隐藏类”链接在一起。

有人可以澄清一下吗? 如果我的假设是正确的,那么新的“ES6 类语法”确实更慢。

基于文章:JavaScript engine fundamentals: Shapes and Inline Caches · Mathias Bynens

最佳答案

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 团队 is working on it .但即使性能差异很小,在很多情况下您也可能不会注意到。

Read on

关于javascript - JavaScript 可以优化这个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990631/

相关文章:

c++ - 为什么数组元素长度的地址计算可以被 2 的幂整除更有效?

performance - 合并加入笛卡尔

Python-更改文件扩展名哪个命令更好?

javascript - 如何重新定义 'this' 并重用另一个类的方法。多态性

javascript - 如何使用 ES5 原型(prototype)重构类表达式?

javascript - 同时更改所有输入值

javascript - 在我的例子中如何使用 php 传递参数

javascript - 如何在 Google Polymer 2 中访问 'properties'?

javascript - 选择单元格内的元素而不选择表格行

javascript - 在 ES6 中,为什么不使用 this 就不能引用同级方法?