你不知道的高性能JAVASCRIPT


Posted in Javascript onJanuary 18, 2016

本文会分享一些高效的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,现在都知道了吧!

Javascript 相关文章推荐
div层的移动及性能优化
Nov 16 Javascript
JS解析XML实例分析
Jan 30 Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
js移动端图片压缩上传功能
Aug 18 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 #Javascript
jQuery实现多级联动下拉列表查询框
Jan 18 #Javascript
jquery validate表单验证的基本用法入门
Jan 18 #Javascript
jQuery添加删除DOM元素方法详解
Jan 18 #Javascript
AngularJS仿苹果滑屏删除控件
Jan 18 #Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
Jan 18 #Javascript
jquery.validate 自定义验证方法及validate相关参数
Jan 18 #Javascript
You might like
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
js类型检查实现代码
2010/10/29 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python中__call__用法实例
2014/08/29 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
高中生操行评语
2014/04/25 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
男方婚前保证书
2015/02/28 职场文书
起诉书格式范文
2015/05/20 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
索尼ICF-5900W收音机测评
2022/04/24 无线电
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers