清单 12. 避免隐式类型转换
- var str = new Stirng(“12345678”), arr = [];
- for(var i = 0; i <= s.length; i++){
- arr.push( str.charAt(i));
- }
这样一来,变量“str”作为一个字符串对象,就不会有这种隐式类型转换的过程了,这样一来,效率会显著提高。
字符串匹配
JavaScript 有 RegExp 对象,支持对字符串的正则表达式匹配。是一个很好的工具,但是它的性能并不是非常理想。相反,字符串对象(String)本身的一些基本方法的效率是非常高的,比如“substring”,“indexOf”,“charAt”等等,在我们需要用正则表达式匹配字符串时,可以考虑一下:
是否能够通过字符串对象本身支持的基本方法解决问题。
是否可以通过“substring”来缩小需要用正则表达式的范围。
这些方式都能够有效的提高程序的效率。
关于正则表达式对象,还有一点需要注意,参考如下代码:
清单 13. 正则表达式
- for(var i = 0; i <= str_array.length; i++){
- if(str_array[i].match(/^s*extra\s/)){
- ……………………
- }
- }
这里,我们往“match”方法传入“/^s*extra\s/”是会影响效率的,它会构建临时值为“/^s*extra\s/”的正则表达式对象,执行“match”方法,然后销毁临时的正则表达式对象。我们可以这样做:
清单 14. 利用变量
- var sExpr = /^s*extra\s/;
- for(var i = 0; i <= str_array.length; i++){
- if(str_array[i].match(sExpr)){
- …………………
- }
- }
这样就不会有临时对象了。
setTimeout 和 setInterval
“setTimeout”和“setInterval”这两个函数可以接受字符串变量,但是会带来和之前谈到的“eval”类似的性能问题,所以建议还是直接传入函数对象本身。
利用提前退出
参考如下两段代码:
清单 15. 利用提前退出
- // 代码 1
- var name = … .;
- var source = …… ;
- if(source.match(/ …… /)){
- ……………………………
- }
- // 代码 2
- var name = … .;
- var source = …… ;
- if(name.indexOf( … ) &&source.match(/ …… /)){
- ……………………………
- }
代码 2 多了一个对“name.indexOf( … )”的判断,这使得程序每次走到这一段时会先执行“indexOf”的判断,再执行后面的“match”,在“indexOf”比“match”效率高很多的前提下,这样做会减少“match”的执行次数,从而一定程度的提高效率。