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元素

注:第五点图片解释

 

posted @ 2023-01-24 23:01  671_MrSix  阅读(33)  评论(0)    收藏  举报