js对象优化
- 以相同顺序初始化对象成员,避免隐藏类的调整
JavaScript是动态类型的,变量是没有类型的(值才有),但是在编译器解析的时候,会给对象的属性赋予一个类型(叫做hiddenClass,多达21种类型),以相同顺序初始化对象成员,可以避免类的调整。
const p1 = { name: 'zjy'}
p1.age = 18
const p2 = { age: 18}
p2.name = 'zjy'
这样做并不会对hiddenClass进行复用,即使是一样的,但是在V8内部上的实现会将每个属性都放入一个有序的容器,所以不是相同顺序的对象成员,会进行类的调整,造成性能上的问题。
const p1 = { name: 'zjy'}
p1.age = 18
const p2 = { name: 'zjy'}
p2.age = 18
这样就可以复用,不会担心创建hiddenClass。
- 实例化后避免添加新属性
const p1 = { name: 'zjy'} // In-Object属性,创建时就存在上面的属性
p1.age = 18 // Normal/Fast属性,存储在property store,需要间接查找属性
- 尽量使用Array代替array-like对象
数组会进行极大的优化,但类数组不会。
Array.prototype.forEach(arrayLike,() => {})
V8推荐先将类数组转换为数组,这样效率比调用call方式快。
const arr = Array.prototype.slice.call(arrayLike,0)
arr.forEach(() => {})
- 避免读取超过数组的长度
存在数组越界问题;
arr[arr.length]值为undefined,会沿着原型链进行查找,最终返回undefined;
- 避免元素类型转换
const arr = [1,2,3] // PACKED_SMI_ELEMENTS // PACKED:代表元素的满的,元素不存在null,undefined // SMI:代表Int类型 arr.push(4.4) // PACKED_DOUBLE_ELEMENTS // DOUBLE: 代表DOUBLE类型 // 上述代码是一个讲解过程:越降级越通用,但是优化减少 // HOLEY_DOUBLE_ELEMENTS:向下降级,代表包含null、undefined元素
注:第五点图片解释

以自己现在的努力程度,还没有资格和别人拼天赋

浙公网安备 33010602011771号