前端程序员必须知道的高性能Javascript知识


Posted in Javascript onAugust 24, 2016

想必大家都知道,JavaScrip是全栈开发语言,浏览器,手机,服务器端都可以看到JS的身影。 本文会分享一些高效的JavaScript的最佳实践,提高大家对JS的底层和实现原理的理解。

数据存储
计算机学科中有一个经典问题是通过改变数据存储的位置来获得最佳的读写性能,在JavaScript中,数据存储的位置会对代码性能产生重大影响。 ? 能使用{}创建对象就不要使用new Object,能使用[]创建数组就不要使用new Array。JS中字面量的访问速度要高于对象。 ? 变量在作用域链中的位置越深,访问所需实践越长。对于这种变量,可以通过缓存使用局部变量保存起来,减少对作用域链访问次数 ? 使用点表示法(object.name)和操作符(object[name])操作并没有太多区别,只有Safari会有区别,点始终更快

循环
在JS中常见的循环有下面几种:

for(var i = 0; i < 10; i++) { // do something} 
for(var prop in object) { // for loop object}  
[1,2].forEach(function(value, index, array) { // 基于函数的循环})

毋庸质疑,第一种方式是原生的,性能消耗最低的,速度也最快。第二种方式for-in每次迭代都回产生更多的开销(局部变量),它的速度只有第一种 的1/7 第三种方式明显提供了更便利的循环方式,但是他的速度只有普通循环的1/8。所以可以根据自己项目情况,选择合适的循环方式。

事件委托
试想一下页面上每一个A标签添加一个事件,我们会不会给每一个标签都添加一个onClick呢。 当页面中存在大量元素都需要绑定同一个事件处理的时候,这种情况可能会影响性能。每绑定一个事件都加重了页面或者是运行期间的负担。对于一个富前端的应 用,交互重的页面上,过多的绑定会占用过多内存。 一个简单优雅的方式就是事件委托。它是基于事件的工作流:逐层捕获,到达目标,逐层冒泡。既然事件存在冒泡机制,那么我们可以通过给外层绑定事件,来处理 所有的子元素出发的事件。

document.getElementById('content').onclick = function(e) { 
  e = e || window.event;  
  var target = e.target || e.srcElement;  //如果不是 A标签,我就退出  
  if(target.nodeNmae !=== 'A') { return }  //打印A的链接地址  
  console.log(target.href) }

重绘与重排
浏览器下载完HTMl,CSS,JS后会生成两棵树:DOM树和渲染树。 当Dom的几何属性发生变化时,比如Dom的宽高,或者颜色,position,浏览器需要重新计算元素的几何属性,并且重新构建渲染树,这个过程称之为重绘重排。

bodystyle = document.body.style; 
bodystyle.color = red; 
bodystyle.height = 1000px; 
bodystyke.width = 100%;

上述方式修改三个属性,浏览器会进行三次重排重绘,在某些情况下,减少这种重排可以提高浏览器渲染性能。 推荐方式如下,只进行一次操作,完成三个步骤:

bodystyle = document.body.style; 
bodystyle.cssText 'color:red;height:1000px;width:100%';

JavaScript加载
IE8,Firefox3.5,Chrome2都允许必行下载JavaScript文件。所以<script>不会阻塞其他标签下载。 遗憾的是,JS下载过程依然会阻塞其他资源的下载,比如图片。尽管最新的浏览器通过允许并行下载提高了性能,但是脚本阻塞任然是一个问题。 因此,推荐将所有的<script>标签放在<body>标签的底部,以尽量减少对整个页面渲染的影响,避免用户看到一片空白

JS文件高性能部署
既然大家已经知道多个<script>标签会影响页面渲染速度,那么就不难理解“减少页面渲染所需的 HTTP”是网站提速的一条经典法则。 所以,在产品环境下合并所有的JS文件会减少请求数,从而加快页面渲染速度。 除了合并JS文件,我们还可以压缩JS文件。压缩是指将文件中与运行无关的部分进行剥离。剥离内容包括空白字符,和注释。改过程通常可以将文件大小减半。 还有一些压缩工具会将局部变量的长度减小,比如:

var myName = "foo" + "bar"; 
//压缩后变成 
var a = "foobar";

缓存JS文件
缓存HTTP组件能极大提高网站回访的用户体验。Web服务器通过“Expires HTTP响应头”来告诉客户端一个资源应该缓存多长时间。当然,缓存也有自己的缺陷: 当应用升级时,你需要确保用户下载到最新的静态内容。这个问题可以通过改变静态资源的文件名来解决。 你可能在产品环境看到浏览器引用jsapplication-20151123201212.js,这种就是以时间戳的方式保存新的JS文件,从而解决缓存不更新问题。

总结
当然,高效的JS不仅仅只有这些可以改进的地方,如果能够减少一些性能的损耗,我们就能更高效的使用JavaScript进行开发了。

Javascript 相关文章推荐
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
JavaScript中Function详解
Feb 27 Javascript
简单的jQuery入门指引
Jul 28 Javascript
JS简单随机数生成方法
Sep 05 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
Nov 22 Javascript
基于D3.js实现时钟效果
Jul 17 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
Dec 13 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 Javascript
关于JavaScript数组你所不知道的3件事
Aug 24 #Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 #Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 #Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 #Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 #Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 #Javascript
input 禁止输入特殊字符的四种实现方式
Aug 24 #Javascript
You might like
十天学会php之第九天
2006/10/09 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
微信支付开发维权通知实例
2016/07/12 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python的标准模块包json详解
2017/03/13 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
俄罗斯儿童和青少年服装、鞋子及配件的在线商店:Orby
2020/02/20 全球购物
培训楼经理岗位责任制
2014/02/10 职场文书
技能竞赛活动方案
2014/02/21 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
党员带头倡议书
2015/04/29 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
法人身份证明书
2015/06/18 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
Python的property属性详细讲解
2022/04/11 Python