JavaScript可以优化此对象吗?

时间:2018-06-22 14:54:39

标签: 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

1 个答案:

答案 0 :(得分:4)

  

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

不。 foo将创建一个这样的隐藏类(伪代码):

{ number1: Number, number2: Number }

但是bar的构造将创建三个隐藏的类,首先是一个空的类:

{}

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

 { number1: Number } -> {}

第二次分配后,它将再次扩展:

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

实际上,隐藏类不等于foo的隐藏类,因为它被分成多个相互延伸的隐藏类。

  

如果我的假设是正确的,那么新的“ ES6类语法”确实会慢一些。

可能是。对象文字确实非常快,而类构造函数却要慢一些。实际上,它们甚至比常规功能慢,但是V8团队is working on it。但是,即使性能差异很小,在很多情况下您也可能不会注意到它。

Read on