Pro*_*OOB 6 javascript performance javascript-engine es6-class
想象一下,我们定义了一个像这样的新对象:
const foo = {number1: 1, number2: 2}
Run Code Online (Sandbox Code Playgroud)
这应该定义一个具有这两个属性的新"隐藏类".
现在假设我使用ES6类语法定义了一个新类.
class Numbers {
constructor() {
this.number1 = 1
this.number2 = 2
}
}
Run Code Online (Sandbox Code Playgroud)
然后我从中创建一个新对象.
const bar = new Numbers()
Run Code Online (Sandbox Code Playgroud)
现在的问题是:"隐藏类"是否与隐藏类bar相同foo?
因为我想象的是第一个定义将创建一个具有两个属性的新"隐藏类",但第二个将创建一个新的"隐藏类",然后它将创建一个带有一个属性的新"隐藏类",然后创建还有另一个属性的"隐藏类"导致三个"隐藏类"链接在一起.
有人可以澄清一下吗?如果我的假设是正确的那么新的"ES6类语法"确实更慢.
现在的问题是:bar 的“隐藏类”是否与 foo 的隐藏类相同?
不会。foo会创建一个像这样的隐藏类(伪代码):
{ number1: Number, number2: Number }
Run Code Online (Sandbox Code Playgroud)
然而, 的构造bar将创建三个隐藏类,首先是一个空类:
{}
Run Code Online (Sandbox Code Playgroud)
然后第一个属性将被分配并扩展现有的隐藏类:
{ number1: Number } -> {}
Run Code Online (Sandbox Code Playgroud)
第二次分配后,它将再次扩展:
{ number2: Number } -> { number1: Number } -> {}
Run Code Online (Sandbox Code Playgroud)
因此,实际上隐藏类并不等于 的隐藏类,foo因为它分为多个相互扩展的隐藏类。
如果我的假设是正确的,那么新的“ES6 类语法”确实会更慢。
大概。对象字面量确实很快,类构造函数有点慢。它们实际上比常规函数还要慢,但 V8 团队正在努力解决这个问题。但即使存在很小的性能差异,在很多情况下您也可能不会注意到它。