《高性能javascript》读书笔记:第四章 算法和流程控制
循环语句 |
1, for(var i=0;i<10;i++){ }//这里要注意一点:js只有函数级作用域,因此在for循环中定义一个新变量等同于在循环体外定义一个新变量
2, while(条件){ }
3, do{ }while(条件)
4, for(var prop in object){ }//可以枚举任何对象的属性名。循环体每次运行时prop变量被赋值为object的一个属性名字符串,直到所有属性遍历完才返回。
上述,只有for-in 循环比其它几种明显要慢。 在js中,倒序循环会略微提升性能 如果需要循环1000次以上,建议减少迭代次数,可用如下方式: var i=items.length%8; 5, items.forEach(function(value,index,array){ });//三个参数依次表示当前数组项的值、索引、数组本身。只在Firefox,Chrome,Safari中被原生支持
其它JS库等价实现: YUI 3 Y.Array(items,function(value,index,array){});
jquery: JQuery.each(items,function(index,value){});
Dojo: dojo.forEach(items,function(value,index,array){});
Prototype: items.each(function(value,index){});
MooTools: $each(items,function(value,index){});
|
条件语句 |
1, 条件较少时使用if-else,条件数量较大时使用swith 2,优化if-else: a,确保最可能出现的条件放在首位 b,减少条件判断的次数,可把if-else组织成一系列嵌套的if-else 3,条件语句数量很大时,用数组和普通对象来构造查找表,通过查找表访问数据比if-else或swith快很多。如: swith(value){ 整个结构可用一个数组作为查找表来替代: var results=[result0,result1,....result9,result10]
|
递归 |
递归函数的潜在问题是终止条件不明确或缺少终止条件会导致函数长时间运行,并使得用户界面处于假死状态。而且,递归函数还可能遇到浏览器的“调用栈大小限制”(Call stack size limites) 当使用了太多的递归,甚至超过最大调用栈容易时,浏览器会报告以下出错信息: IE: 提示:Stack overflow at line x 错误类型:常规的Error错误 Firefox: 提示:Too much recursion 错误类型:内部错误(InternalError) Safari: 提示:Maximum call stack size exceeded 错误类型:RangeError Opera: 提示: Abort(control stack overflow) 会中止js引擎,不抛出错误 Chrome: 是唯一不显示调用栈溢出错误的浏览器 错误类型:RangeError
上述错误会像其它错误一样向上冒泡传递,Firefox冒泡停止于Firebug和错误控制台,Safari/Chrome会显示在js控制台,只有IE,不但显示一个js错误,还会弹出一个类似alert警告的对话框显示栈溢出信息。可以但不建议用try-catch捕获,有潜在调用栈溢出问题的脚本就不应该发布上线。
如果遇到栈溢出错误,可将方法改为迭代算法,或使用Memoization来避免重复计算。 |