JavaScript 可以优化这个对象吗?

Can JavaScript optimize this object?

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

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

这应该使用这两个属性定义一个新的 "Hidden Class"。

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

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

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

const bar = new Numbers()

现在的问题是:bar 的 "Hidden Class" 是否与 foo 的隐藏 Class 相同?

因为我想象的是第一个定义将创建一个具有两个属性的新 "Hidden Class" 但第二个将创建一个新的 "Hidden Class" 然后它将创建一个新的 "Hidden Class" 与一个 属性 然后创建另一个 "Hidden Class" 与另一个 属性 导致三个 "Hidden Classes" 链接在一起。

有人可以澄清一下吗? 如果我的假设是正确的,那么新的 "ES6 class syntax" 确实更慢。

基于文章: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 将创建一个隐藏的 class 像这样(伪代码):

{ number1: Number, number2: Number }

然而 bar 的构造将创建三个隐藏的 classes,首先是一个空的:

{}

然后将分配第一个 属性 并扩展现有的隐藏 class:

 { number1: Number } -> {}

第二次赋值后,它将再次扩展:

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

所以实际上隐藏的 class 不等于 foo 的隐藏的 class 因为它被分割成多个隐藏的 class 相互延伸。

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

可能吧。对象字面量非常快,class 构造函数有点慢。它们实际上比常规函数还要慢,但是 V8 团队 is working on it。但即使性能差异很小,在很多情况下您也可能不会注意到它。

Read on