算法和流程控制中的几个注意的点
1.关于循环
ES3中: 有四种循环类型(for,while,do...while,for(in))
其中for(in)用于遍历对象中的可枚举的属性,他的性能最差,大概相差7倍
| # | demo | 返回值 | 定义 | 实例的属性 | 原型对象的属性 | 可枚举的属性 | 不可枚举的属性 |
|---|---|---|---|---|---|---|---|
| in | "name" in obj | true/false | 判断属性是否属于该对象 | yes | yes | yes | yes |
| !== | obj.name!==undefined | true/false | 判断对象有无该属性 | yes | yes | yes | yes |
| for(in) | for(var item in obj){...} | --- | 遍历对象中的可枚举的属性 | yes | yes | yes | no |
| hasOwnProperty | obj.hasOwnProperty('name') | true/false | 判断属性是否属于实例 | yes | no | yes | yes |
| propertyIsEnumerable | obj.propertyIsEnumerable('name') | true/false | 判断枚举的属性是否属于实例 | yes | no | yes | no |
优化循环的第一步就是:减少对象成员及数组项的查找次数
//常见的写法
for (var i=0; i < items.length; i++){...}
//最小化属性查找
for (var i=0, len=items.length; i < len; i++){...}
//减少属性查找并反转,性能更好(在顺序无关的时候可用)
//相比正序, 减少了一次比较
for (var i=items.length; i--; ){...}
优化循环的第二步就是:减少迭代次数
//广为人知的一种限制循环迭代次数的模式--达夫设备
//500000次迭代中,运行时间比常规循环少70%
var iterations = Math.floor(items.length/8),
startAt = items.length % 8,
i = 0;
do {
switch(startAt){
case 0: process(items[i++]);
case 7: process(items[i++]);
case 6: process(items[i++]);
case 5: process(items[i++]);
case 4: process(items[i++]);
case 3: process(items[i++]);
case 2: process(items[i++]);
case 1: process(items[i++]);
}
startAt = 0;
}while(--iterations);
ES4中增加了forEach()
array.forEach(function(value,index,array){...});性能上比for(in)要好一些
ES5中增加了map(),filter(),every(),some(),reduce()等等
他们的目的是生成一个数组副本或者用于判断数组是否符合特定条件
2.关于条件语句
优化原则1: 大多数情况下switch比if-else运行要快,条件数量越大越明显
优化原则2: if-else中的条件语句应该总是按照从最大概率到最小概率的顺序排列,以确保运行速度最快
3.字符串连接
优化原则: +=最快, join和concat都慢