美文网首页
JavaScript性能优化

JavaScript性能优化

作者: 洲行 | 来源:发表于2020-10-09 01:33 被阅读0次

如何精准测试JS的性能,通过https://jsbench.me/

1.慎用全局变量

  • 全局变量定义在全局执行上下文,是所有作用域链的顶端
  • 全局执行上下文一直存在于上下文执行栈,直到程序退出
  • 如果某个局部作用域出现了同名变量,则会遮蔽或污染全局


    性能对比

    这就是全局变量与局部变量的性能对比,由于全局变量在作用域链的顶端,所以查找时间就变长了

2.缓存全局变量

将使用中无法避免的全局变量缓存到局部



getBtn2将全局变量缓存至函数内部,通过jsperf发现getBtn2的性能提升

4.通过原型对象添加附加方法

var fn1 = function() {
  this.foo = function() {
    console.log(11111)
  }
}
let f1 = new fn1()
// 通过原型对象添加附加方法, 效率更高
var fn2 = function() {}
fn2.prototype.foo = function() {
  console.log(11111)
}
let f2 = new fn2()

直接添加到构造函数中会在初始化实例的时候初始化此f1函数,不符合高效的标准所以都会添加到原型上,
在prototype上的方法只会初始化一次,可以提供给所有实例使用,符合节省内存开销的标准,所以一般都会添加到原型对象。

5.避免属性访问方法使用

function Person() {
  this.name = 'icoder'
  this.age = 18
  this.getAge = function() {
    return this.age
  }
}
const p1 = new Person()
const a = p1.getAge()
// 直接访问
function Person() {
  this.name = 'icoder'
  this.age = 18
}
const p2 = new Person()
const b = p2.age

直接访问的效率更高,JS不需要设置属性访问方法,所有属性都是外部可见的。

6.For循环优化

减少循环体中活动,把循环体中重复的事情抽离到外面去

for (var i = 0; i < arrList.length; i++) {
  console.log(arrList[i])
}
// 长度变量可以提前保存
for (var i = 0 ,var len = arrList.length; i < len; i++) {
    console.log(arrList[i])
}

采用最优的循环方式


可以看出forEach是最快的

文档碎片优化节点添加

节点的添加操作必然会有回流和重绘

for (var i = 0; i < 10; i++) {
      var oP = document.createElement('p')
      oP.innerHTML = i 
      document.body.appendChild(oP)
    }

通过createDocumentFragment,文档碎片容器,一次性添加

    const fragEle = document.createDocumentFragment()
    for (var i = 0; i < 10; i++) {
      var oP = document.createElement('p')
      oP.innerHTML = i 
      fragEle.appendChild(oP)
    }

    document.body.appendChild(fragEle)

克隆优化节点操作

比如你想添加一个p标签,此时文档中已经有了一个p标签,样式和内容和你想添加的差不多,所以可以通过克隆操作提高效率

for (var i = 0; i < 3; i++) {
    var oP = document.createElement('p')
    oP.innerHTML = i
    document.body.appendChild(oP)
}
// 通过克隆方式
var oldP = document.getElementById('box1')
for (var i = 0; i < 3; i++) {
    var newP = oldP.cloneNode(false)
    newP.innerHTML = i
    document.body.appendChild(newP)
}

直接量替换new Object

var a1 = new Array(3)
a1[0] = 1
a1[1] = 2
a1[2] = 3
// 直面量效率高
var a = [1, 2, 3]

堆栈中JS执行过程

JS执行过程

优化就是从JS执行过程中,找出可以优化的点,无外乎就是,作用域链查找的层级,当前内存是否释放等

减少判断层级

通过提前return,减少嵌套层级


正常if else罗列 提前return 对比

提前return不仅速度提升,且代码更整洁易读。

减少作用域链查找层级

提高明显

拿空间换时间

减少数据读取次数

访问对象的属性时,可以提前将属性缓存

字面量与构造式

字面量要快

因为字面量是直接在内存开辟空间,第一种方法又涉及了构造函数和查找对象等

使用惰性函数

使用事件委托

相关文章

  • 前端性能优化

    前端性能优化 下面是我认知的前端性能优化的策略,本书主要着手 JavaScript 优化展开阐述。 JavaScr...

  • JavaScript 性能优化

    介绍 性能优化是不可避免的哪些内容可以看做性能优化无处不在的前端性能优化 JavaScript内存管理 为什么要使...

  • Chrome 性能监控 性能分析

    Chrome开发者工具之JavaScript内存分析 前端性能优化 —— 前端性能分析 Chrome DevToo...

  • Javascript 性能优化

    Javascript最初是解释型语言,现在,主流浏览器内置的Javascript引擎基本上都实现了Javascri...

  • JavaScript性能优化

    1,web页面脚本阻塞:由于脚本会阻塞页面其他资源的下载,因此推荐将所有的 标签尽可能放到 标签的底部,可以尽量减...

  • Javascript 性能优化

    加载 放到body底部 数据读取 访问局部变量 比 全局要快 频繁访问对象属性,请保存到变量中 DOM操作 最小化...

  • javascript性能优化

    优化页面加载时间html标签加载顺序浏览器加载和执行script标签引入的js时,会暂停页面渲染,直到代码加载并执...

  • JavaScript性能优化

    如何精准测试JS的性能,通过https://jsbench.me/[https://jsbench.me/] 1....

  • JavaScript 性能优化

    作者:酸菜牛肉 文章内容输出来源:拉勾教育大前端高薪训练营课程 性能优化介绍 内存管理 ...

  • JavaScript性能优化

    1. 如何精准测试 JavaScript 性能 ● 本质上就是采集大量的执行样本进行数学统计和分析● 使用基于 B...

网友评论

      本文标题:JavaScript性能优化

      本文链接:https://www.haomeiwen.com/subject/kikcpktx.html