上半部分代码块:
javascript复制代码
const obj1 = {
a: 1
}
const obj2 = {
a: 1
}
const obj3 = {
a: 1
}
下半部分代码块:
javascript复制代码
const obj1 = {
a: 1
}
const obj2 = {
b: 1
}
const obj3 = {
c: 1
}
总结:
- 上半部分代码效率更高,因为它重用了隐藏类(Hidden Class)。
- 下半部分代码由于属性名不同,导致每个对象有不同的隐藏类,降低了效率。
测试代码:
javascript复制代码
// 测试代码
console.time('a');
for (let i = 0; i < 1000000; ++i) {
const obj = {};
obj['a'] = i;
}
console.timeEnd('a');
console.time('b');
for (let i = 0; i < 1000000; ++i) {
const obj = {};
obj[` ${i}` ] = i;
}
console.timeEnd('b');
JS运行机制:
| 浏览器 | 内核 | JS解析引擎 |
|---|---|---|
| Chrome | 早期 WebKit,现目前 Blink | V8 |
| Mozilla Firefox | Gecko | SpiderMonkey |
| Edge | Chromium | Chakra / V8 |
| Safari | Webkit | JavascriptCore |
补充说明:
- 比较主流的JS引擎是V8,这里假设是跑在Chrome或Node上,用的是V8引擎。
- V8是一个C++实现的JS解析引擎,内部利用隐藏类(Hidden Class)的方式来存放JS对象。
- 隐藏类的特性是:多个属性顺序一致的JS对象,会重用同一个隐藏类,减少new Class的开销。
- 所以左边生成1个隐藏类,而右边只生成3个隐藏类,因此左边代码性能更好。
- 指导代码编写习惯:定义对象或类时,尽可能保证属性顺序一致。