1、增加eslint规范
在团队协作中,为避免低级 Bug、产出风格统一的代码,会预先制定编码规范。使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量。
使用eslint不仅仅可以统一代码规范,它的很多规则同时考虑了javascript语言的隐藏缺点以及一些被广泛认同的性能规范,因此使用eslint也可以同时提升代码的性能。
可参考使用npm包eslint-config-fornode
2、避免使用同步代码
Node.js的一个显著特征是:它从上到下的设计和实现都是为了实现异步,一个同步调用可能将导致性能从每秒上千次的请求降至只有几十个。
不幸的是,我们代码总会有发生同步/阻塞的调用。
3、统一异步编程风格
代码中实现异步编程的代码包含了promise、callback、generator、async/await三种风格,为了增加代码的可读性统一进行封装使用,例如使用generator和yield风格进行异步编程,或者使用async/await。
4、代码保持小且轻
缩减不必须需要的模块,直接用标准的V8 JavaScript函数替代实现,性能会得到显著的提高。
用更简单更高效的方法实现相同的功能。(说起来容易做起来最难的一步)
5、定义局部变量
JavaScript引擎在作用域链中搜索的深度越大,那么操作也就会消耗更多的时间。引擎首先从 this 开始查找局部变量,然后是函数参数、本地定义的变量,最后遍历所有的全局变量。
因为局部变量在这条链的起端,所以查找局部变量总是比查找全局变量要块。所以当你想要不止一次地使用一个全局变量的时候,你应该将它定义成局部变量。
(es6最小作用域为块级)
6、优化循环
根据循环逻辑判断使用倒循环还是正循环,而不是一味的使用正循环。
考虑使用do...while(后测试循环)、while(前测试循环)、map、reduce、filter等代替for循环。(map、reduce、filter可实现函数式编程,链式代码更加易读)
简化终止条件,使用continue,break控制减少循环开销。
当循环次数是确定的,消除循环并使用多次函数调用往往会更快。
避免双重或更多重循环。
7、避免 for-in 循环(和基于函数的迭代)
这背后的逻辑非常直接:要遍历一个集合内的元素,你可以使用诸如for循环、或者do-while循环来替代for-in循环,for-in循环可能需要遍历额外的数组项(会遍历原型链)。
8、使用switch和三目运算符代替if
将条件分支,按可能性顺序从高到低排列:可以减少解释器对条件的探测次数
9、精简变量声明
同一种数值声明,同类别数据声明应该用一条语句声明,不同变量用“,”隔开,增加代码的可读性并且将变量代码分类,减少出错概率。
10、数组虑重
双重循环,时间复杂度为O(n2)。
排序后遍历,这种方法的时间复杂度为O(n),但是还要考虑排序的消耗。
Hash的方法方法时间复杂度为O(n),是应用最为广泛的去重方法。
11、数组、对象深拷贝实现和优化
数组深拷贝
var a = [1,2,3,4,5];
var b = Array.from(a);//方法1 ES6
var b = a.slice(0);//方法2
var b = a.concat([]);//方法3
var b = JSON.parse(JSON.stringify(array));//方法4
注意1:方法1、2、3只适合数组成员为非引用类型的情况,如果数组成员为引用类型,这些方法拷贝的引用类型成员依然为浅拷贝
注意2:方法4可以完美深拷贝数组,但该方法也并不是没有缺点,在此不详细描述。
对象深拷贝 使用Object.create实现 Object.create实现:
if (!Object.create) {
Object.create = function (o) {
function F() {} //定义了一个隐式的构造函数
F.prototype = o;
return new F(); //其实还是通过new来实现的
};
}
网友评论