【笔记】改善javascript程序的188个建议27-33
2015-04-16 13:59
573 查看
27、小心if隐藏的BUG
(1)if(a = 1){...}
把比较运算符错写为赋值运算符。
为了防止出现这样低级令人讨厌的错误,建议在条件表达式的比较运算中,把常量写在左侧,把变量写在右侧。这样在你写错的时候,会报错。
if( 1 == a){ ... }
(2)在if之后添加了分号(;)
if(a==1);{
...
}
28、使用查表法提高条件检测的性能
当有大量离散值需要测试时,使用if和switch都比使用查表法要慢得多。
比如:
改为:
使用查表法时,必须完全消除所有条件判断。操作转换成一个数组项查询或一个对象成员查询。使用查表法的一个主要优点:由于没有条件判断,当候选值数量增加时,基本上不会增加额外的性能开销。
29、准确使用循环体
在js提供的四种循环类型中,只有for in循环执行速度比其他循环明显要慢。
除非需要对数目不详的对象属性进行操作,否则避免使用for in循环。
30、使用递归模式
递归函数会受到浏览器调用栈大小的限制。
当使用了太多的递归,超过最大调用栈尺寸时,浏览器会弹出错误信息。
当出现调用栈尺寸限制的问题时,第一步定位在代码中的递归实例上。
两种递归方式:
(1)直接递归:
(2)精巧模式:
a();
常见的栈溢出原因是一个不正确的终止条件。如果条件是正确的,那么算法包含了太多层递归,为了能够安全滴在浏览器中运行,应改用迭代、制表或混合模式。
31、使用迭代
使用迭代代替递归,速度会慢点,但是可以避免栈溢出错误。
32、使用制表(记忆递归)
比如,阶乘可以改为:
使用制表法设计阶乘函数的关键是简历一个缓存对象,此对象位于函数内部,其中预制了两个最简单的阶乘,在计算阶乘之前,先检查缓存中是否已经存在相应的计算结果。没有对应的缓冲值说明这是第一次计算此数值的阶乘,计算完成之后,结果存入缓存中,供以后使用。
33、优化循环结构
(1)优化结构
(2)避免不必要的重复操作
不需要变化的东西,比如数组的声明等,可以放在循环体外,不用每次都声明。
(3)妥善定义循环变量
(1)if(a = 1){...}
把比较运算符错写为赋值运算符。
为了防止出现这样低级令人讨厌的错误,建议在条件表达式的比较运算中,把常量写在左侧,把变量写在右侧。这样在你写错的时候,会报错。
if( 1 == a){ ... }
(2)在if之后添加了分号(;)
if(a==1);{
...
}
28、使用查表法提高条件检测的性能
当有大量离散值需要测试时,使用if和switch都比使用查表法要慢得多。
比如:
switch(value): case 0 : return result0; case 1 : return result1; case 2 : return result2; case 3 : return result3; case 4 : return result4; case 5 : return result5; case 6 : return result6; case 7 : return result7; case 8 : return result8; case 9 : return result9; default : return result10; }
改为:
var results = [result0,result1,result2,result3,result4,result5,result6,result7,result8,result9,result10]; return results[value];
使用查表法时,必须完全消除所有条件判断。操作转换成一个数组项查询或一个对象成员查询。使用查表法的一个主要优点:由于没有条件判断,当候选值数量增加时,基本上不会增加额外的性能开销。
29、准确使用循环体
在js提供的四种循环类型中,只有for in循环执行速度比其他循环明显要慢。
除非需要对数目不详的对象属性进行操作,否则避免使用for in循环。
30、使用递归模式
递归函数会受到浏览器调用栈大小的限制。
当使用了太多的递归,超过最大调用栈尺寸时,浏览器会弹出错误信息。
try{ recurse(); }catch(ex){ alert('error info'); }
当出现调用栈尺寸限制的问题时,第一步定位在代码中的递归实例上。
两种递归方式:
(1)直接递归:
function r(){ r(); } r();
(2)精巧模式:
function a(){ b(); } function b(){ a(); }
a();
常见的栈溢出原因是一个不正确的终止条件。如果条件是正确的,那么算法包含了太多层递归,为了能够安全滴在浏览器中运行,应改用迭代、制表或混合模式。
31、使用迭代
使用迭代代替递归,速度会慢点,但是可以避免栈溢出错误。
32、使用制表(记忆递归)
比如,阶乘可以改为:
function menfactorial(n){ if(!memfactorial.cache){ memfactorial.cache = { '0':1, '1':1 }; } if(!menfactorial.cache.hasOwnProperty(n)){ memfactorial.cache = n*memfactorial(n-1); } return memfactorial.cache ; }
使用制表法设计阶乘函数的关键是简历一个缓存对象,此对象位于函数内部,其中预制了两个最简单的阶乘,在计算阶乘之前,先检查缓存中是否已经存在相应的计算结果。没有对应的缓冲值说明这是第一次计算此数值的阶乘,计算完成之后,结果存入缓存中,供以后使用。
33、优化循环结构
(1)优化结构
(2)避免不必要的重复操作
不需要变化的东西,比如数组的声明等,可以放在循环体外,不用每次都声明。
(3)妥善定义循环变量
相关文章推荐
- 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
- 编写高质量代码:改善JavaScript程序的188个建议
- [已读]编写高质量代码 改善JavaScript程序的188个建议
- 编写高质量代码:改善JavaScript程序的188个建议
- 编写高质量代码:改善JavaScript程序的188个建议
- 《改善javascript程序的188个建议》摘抄
- 编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
- [笔记]改善Java程序的151个建议---第五章 数组和集合
- [笔记]改善Java程序的151个建议---第四章 字符串
- 读编写高质量代码--改善java程序的151个建议笔记
- [编写高质量代码:改善java程序的151个建议]建议33:不要覆写静态方法
- 改善java程序的151个建议--笔记一
- [笔记]改善Java程序的151个建议---第三章 类,对象,方法
- 改善C++ 程序的150个建议学习之建议27:区分内存分配的方式
- [笔记]改善Java程序的151个建议---第二章 基本类型
- 编写高质量代码:改善JavaScript程序建议--面向对象编程
- [编写高质量代码:改善java程序的151个建议]建议33:不要覆写静态方法
- 读《改善js程序的188个建议》
- [笔记]改善Java程序的151个建议---第一章 Java开发中通用的方法和准则
- 《改善Python程序的91个建议》阅读笔记