代码的整体结构是影响运行速度的主要因素之一。代码数量少一定原型速度快,代码数量多却不意味着运行速度一定慢。
1. 循环
类型:
1) for由初始化、前测条件、后执行体、循环体组成: for(var i=0;i<10;i++) {循环体} => for(var i=0,j=10;i<j;i++) {}
2) while由前测条件和循环体组成:var i=0; while(i<10){循环主体 i++;}
3) do-while由后测条件和循环体组成, 循环体会至少运行一次操作,再由后侧条件决定是否再次运行:var i=0; do{循环主体} while(i++<10);
4) for-in可以枚举任何对象的属性名:for(var prop in object) {}
性能:
1) for-in性能差一点,相同迭代数,速度为1/7
2) 性能差不多需要考虑1每次迭代的处理事务2迭代的次数
3) 优化:
减少迭代的工作量:减少对象成员及数组项的查询次数;颠倒数组的顺序,如倒序循环(条件只是简单的与0比较);
减少迭代次数:达夫设备,使一次迭代代替多次迭代操作
var iterations = Math.floor(items.length/8), <=> 速度快 var i = items.length % 8,
startAt = items.length % 8, while(i){
i = 0; process(items[i--]);
do { }
switch(startAt) { i = Math.floor(items.length/8);
case 0: process(items[i++]); while(i) {
case 7: process(items[i++]); process(items[i--]);
case 6: process(items[i++]); process(items[i--]);
case 5: process(items[i++]); process(items[i--]);
case 4: process(items[i++]); process(items[i--]);
case 3: process(items[i++]); process(items[i--]);
case 2: process(items[i++]); process(items[i--]);
case 1: process(items[i++]); process(items[i--]);
} process(items[i--]);
startAt = 0; }
}while(--iterations);
基于函数迭代
items.forEach(function(value, index, array){//当前数值项的值、索引、数组本身.
process(value);
})
2. 条件语句
1) 条件数越多(多余两个),使用switch而不是if-else。
if (color == 'red') { switch(color) {
//代码处理 case "red":
} else if (color == 'blue') { //代码处理
//代码处理 break;
} else { case "blue":
//代码处理 //代码处理
} break;
default:
//代码处理
2) 单个键和单个值之间存在逻辑映射时,判断条件较多时,查找表比if和switch要快。
3. 递归
function factorial(n) {
if (n==0) {
return 1;
} else {
return n*factotial(n-1);
}
}//存在问题:条件不明确或缺少终止条件会导致函数长时间运行,并使得用户界面处于假死状态。还有调用栈大小的限制
1) 调用栈限制,调用栈的大小限制了递归算法在JavaScript中的应用
取溢出异常 try {
recurse();
} catch {
alert("too much recursion!");
}
2) 递归模式:直接递归模式(函数调用自身); 隐伏模式(两个函数相互调用,形成一个无限循环)
3) 迭代,防止栈溢出
合并排序算法是最常见的用递归实现咋算法。
4) Memoization,防止栈溢出