JavaScript 性能提升之路(推荐)


Posted in Javascript onApril 10, 2019

在平时工作做项目的过程中我们有时候会遇到页面加载很久才加载出来的情况,这样严重影响了用户的体验效果。虽然说有时候可能是因为网络问题,但有些时候确实是前端代码没有足够优化导致的。所以通过查阅相关资料并实践后,总结出如下知识点来提升性能。有什么写得不对的地方还希望各路大神指出并加以指点。

1、数据访问

1、将所有script标签放在尽可能接近body标签底部的位置,尽可能减少对整个页面下载的影响。

JavaScript 性能提升之路(推荐)

2、尽量少用全局变量。因为变量在作用域链中的位置越深,访问的时间就越长。局部变量位于作用域链中的第一个对象中,全局变量总是位于作用域链的最后一环,所以全局变量总是最慢的。

3、避免全局查询,如果一定要用到全局变量时,并且需要在某个函数中多次用到该全局变量时,可以定义一个局部变量指向全局变量,来缩短在作用域链中的查询深度。

function addTotrackData(){
  	var allChildrenNode=getAllChildrenDepartmentNodes();
  	for (var i = 0; i < allChildrenNode.length; i++) {
      for (var j=0,len=track.length;j<len;j++) {
        if (trackNode[j]["userId"] == allChildrenNode[i]) {
          trackNode[j]["isOnMap"] = true;
        }
      }
    }
  }

上面代码可以改写为如下所示

function addTotrackData(){
  	var allChildrenNode=getAllChildrenDepartmentNodes();
  	var track=trackNode;
  	for (var i = 0; i < allChildrenNode.length; i++) {
      for (var j=0,len=track.length;j<len;j++) {
        if (track[j]["userId"] == allChildrenNode[i]) {
          track[j]["isOnMap"] = true;
        }
      }
    }
  }

4、将集合的length属性用一个局部变量来保存,在迭代中使用该变量。

for (var j=0,len=track.length;j<len;j++)

5、避免使用with表达式,因为它增加作用域链的长度。而且应当小心的对待try-catch的catch子句,它具有同样效果。

6、一个属性或方法在原型链中的位置越深,它的访问速度就越慢。

7、声明变量时,多个变量合并声明,可以减少内存消耗。

var a;
  var b;
  var c;
  //推荐
  var a,b,c

2、Dom操作

Dom(文档对象模型)是一个独立于语言的,使用xml和html文档操作的应用程序接口。在浏览器中的接口却是以javascript来实现的。Dom和javascript看成两座岛,两者之间通过一座收费的桥连接。一般建议尽量留在javascript岛上。

1、用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。

//dom方式
  var str=""
  var dom=document.getElementById("test");
  var start1=new Date();
  for(var j=0;j<100000;j++){
  	var div=document.createElement("div");
  	div.innerText="test";
  	dom.append(div);					
  }
  var end1=new Date();
  console.log("dom方式:"+(end1-start1));//dom方式:356
  
  //inerHTML方式
  var content="";
  var start=new Date();
  for(var i=0;i<10000;i++){
    content=content+"<div>test</div>";
  }
  document.getElementById("test").innerHTML=content;
  var end=new Date();
  console.log("innerHTML方式:"+(end-start));//innerHTML方式:35

2、如果统一个Dom元素或集合被访问一次以上,最好使用一个局部变量来缓存此Dom成员,在循环中使用局部变量缓存集合引用和集合元素会提升速度。

3、遍历children比childNodes更快。children不区分(包括)注释节点和空文本节点,所以快一些。

4、使用element.cloneNode(bool)复制节点,bool为false表示浅复制,只复制当前节点,bool为true时,表示深复制,还会复制其子节点。这种方式比document.createElement()速度要快一些。

5、使用document.querySelector和document.querySelectorAll("div.warning,div.notice")来快速查找。因为它们返回一个NodeList——由符合条件的节点构成的类数组对象,而不是HTML集合(总是表现出存在性),避免了它所固有的性能问题(以及存在的逻辑问题)。querySelectorAll("div.warning,div.notice")还可以进行联合查询。

6、修改样式时,可以使用div.style.cssText来一起修改样式,或者使用类来修改(便于维护)。

var el = document.getElementById('mydiv');
   //修改3次Dom
  el.style.borderLeft = '1px';
  el.style.borderRight = '2px';
  el.style.padding = '5px';
  //推荐只需要修改1次Dom
  el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;'

7、尽量避免写在HTML标签中写Style属性,使用外联样式便于维护和修改。

8、避免图片和iFrame等的空Src。空Src会重新加载当前页面,影响速度和效率。

9、采用事件委托。元素连接事件句柄会影响页面性能,采用委托利用事件冒泡的性能减少元素连接事件。(事件挂接过程都是发生在onload或DOMContentReady)事件中。

3、循环

1、for-in是四种循环方法中速度最慢的一种,一般用于循环对象(需要查找自身属性还是原型属性)。不建议循环数组。除非要迭代遍历一个属性未知的对象,否则一般不用for-in。

2、改变循环条件的顺序来提高循环性能。

//推荐
  for(var i=items.length;i--;){
    //todo
  }
  //不推荐
  for(var i=0,len=items.length;i<len;i++){
    //todo
  }

3、通过减少循环体来优化性能。

以上所述是小编给大家介绍的JavaScript性能提升详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
jquery offset函数应用实例
Nov 14 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 Javascript
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
Vue.js常用指令的使用小结
Jun 23 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
Jan 31 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
微信小程序个人中心的列表控件实现代码
Apr 26 Javascript
浅谈JavaScript 声明提升
Sep 14 Javascript
vue中可编辑树状表格的实现代码
Oct 31 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 #Javascript
js中数组常用方法总结(推荐)
Apr 09 #Javascript
JS隐藏号码中间4位代码实例
Apr 09 #Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 #Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
Apr 09 #Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 #Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 #Javascript
You might like
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
动态加载js的几种方法
2006/10/23 Javascript
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python:动态路由的Flask程序代码
2019/11/22 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
Django多个app urls配置代码实例
2020/11/26 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
Delphi CS笔试题
2014/01/04 面试题
2014报到证办理个人委托书
2014/10/08 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
《打电话》教学反思
2016/02/22 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
python playwright之元素定位示例详解
2022/07/23 Python