假设我们像这样定义一个新对象:
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 .但即使性能差异很小,在很多情况下您也可能不会注意到。
关于javascript - JavaScript 可以优化这个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990631/