js高级程序设计-24最佳实践
可维护性
可理解性,直观性,可适应性,可扩展性
- 做好注释
- 变量初始化时给出他的类型。
松散耦合
代码要尽量做到解耦。
解耦的关键就是让他们尽量做好自己的事情。分工要明确。
- js 不要直接修改 css 的样式,用更改类名的形式可以降低耦合。
- css 里面也最好不要写 expression 那种东西
- 应用逻辑与事件处理程序最好也能够解耦(比如将从事件中获取和应用逻辑拆分开)
- 任何应用层面的程序都应该可以在不触发事件的情况下运行,这才是测试的可能性
编程实践
不负责创建或者维护某个对象,我们就不能对它们进行修改
- 不要为实例或者原型添加属性和方法
- 不要重新定义已经存在的方法
- 避免全局变量
例如 YUI 就是单一的全局变量,是一个命名空间的概念
- 避免与 null 进行比较
- 将数据单独抽取出来作为常量,隔离逻辑与数据
性能
注意作用域
减少向上层作用域的查找过程,局部的函数或者变量肯定要比全局的开销要小一些。
避免使用with
,因为 with 会建立自己的作用域链,延长了作用域链,肯定是会影响性能的。
选择正确的方法
时间复杂度上的优化
- O(1):正常的常数和变量值,还有数组元素的访问也是 O(1)
- O(log n):二分查找
- O(n):对象的属性获取(因为是个遍历的过程)
- O(n2):每个值都得获取 n 次,插入排序
就是说尽量减少算法的复杂度,多使用局部变量来暂存住,然后如果能够使用数字化的数组位置来访问的话,就尽量用数字位置。
优化循环
- 减值迭代:价值不大,感觉浏览器基本帮你做完了
- 简化终止条件:每次循环都会操作,可以尽量减少 O(n)的属性查找
- 简化循环体:这也是废话了,执行最多的,所以要保证最大限度的优化
- 使用后测试循环:一般的 for 和 while 都是前测试,而如果我们能够保证第一次的值肯定会有一个的话,可以改成后测试循环!!
展开循环
就是在循环次数确定时,消除掉循环换成多次调用函数往往更快。(原理是消除了建立循环和处理终止条件的额外开销)
//duff装置
function duff(array, callback) {
var iterations = Math.ceil(values.length / 8);
var left = values.length % 8;
var i = 0;
if (left > 0) {
do {
callback(array[left]);
} while (--left > 0);
//--left的值就是操作结束的值
}
do {
callback(i++);
callback(i++);
callback(i++);
callback(i++);
callback(i++);
callback(i++);
callback(i++);
callback(i++);
} while (--iterations > 0);
}
这个已经是一个改良过的 duff,最初版本的是通过 switch 写的,通过不写 break 来向下执行的。Duff 的好处就是在大数据处理
的时候减少了每次的判断的逻辑,还是很有意思的~
其实价值不是特别高
发现了个不错的网站,用来测试计算的性能:https://jsperf.com/
避免双重解释
比如下面的
eval("alert(3)");
var say = new Function("alert(4)");
setTimeout("alert(2)", 1000);
这三种写法 js 都需要新建一个解释器来对字符串进行解析的,开销是很大的,尽量避免吧。
还有一些小的 tip
- 尽量用原生的方法,主要是 Math 的,因为这些事 c/c++写的,速度更快
- switch 语句比一般的 for 的速度要快,而且 case 语句可以按照最可能到最不可能的顺序来写
- 位运算符应该会更快一些
最小化语句数
- 语句数其实也会影响执行的速度,我们在申明的时候可以将他们整合。
- 迭代值可以使用++的形式来节省语句。
- 使用数组和对象字面量的形式来书写是能够减少语句的
优化 DOM 操作
- 最小化现场更新,就是 createDocumentFragment 来作为一个占位的,然后都 append 好了之后一次搞定就行。
- 比这个更快地,使用
innerHtml
来改变,因为 innerHtml 是内部调用了内置的 DOM 调用,而不是基于 JS 的 DOM 调用。 - 使用事件代理,这个比较常用,就是在祖先节点上绑定来节省绑定次数以及支持动态绑定
- 合理使用 HTMLCollection,因为文档上的查询开销很昂贵,合理使用
部署
我们的 Js 代码是没法直接放到线上的,因为注释,长变量名和空白其实都是没有价值的。
一般会进行一次 js 的验证,比如 JSLint。
所以一般会进行压缩,比如 YUICompressor,删除空白,注释,缩短变量名。
然后还会有 HTTP 的压缩,比如 GZIP 压缩。
Gzip其实是浏览器与http提供的,浏览器在发送request的时候会发一个Accept-Encoding:gzip,deflate之类,然后服务器就会返回按照它支持的压缩过的文本
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:js高级程序设计-24最佳实践
文章字数:1.3k
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 16:45:23
原始链接:http://panyifei.github.io/2019/08/28/读书笔记/Javascript高级程序设计/24最佳实践/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。