但是这样并不是最好的方式,JavaScript 有个特点,对于 object 对象来说,其属性访问层级越深,效率越低,比如这里的“myObj”已经访问到了第 3 层,我们可以这样改进一下:
清单 7. 缩小对象访问层级
- var myObj = … ..
- ..
- function process(){
- var doc = document;
- var images = doc.getElementsByTagName("img"),
- widget = doc.getElementsByTagName("input"),
- combination = [];
- for(var i = 0; i < images.length; i++){
- combination.push(combine(images[i], widget[2*i]));
- }
- var ctn = myObj.container;
- ctn.property1 = combination[0];
- ctn.property2 = combination[combination.length-1];
- }
我们用局部变量来代替“myObj”的第 2 层的“container”对象。如果有大量的这种对对象深层属性的访问,可以参照以上方式提高性能。
字符串(String)相关
字符串拼接
经常看到这样的代码:
清单 8. 字符串简单拼接
- str += “str1” + “str2”
这是我们拼接字符串常用的方式,但是这种方式会有一些临时变量的创建和销毁,影响性能,所以推荐使用如下方式拼接:
清单 9. 字符串数组方式拼接
- var str_array = [];
- str_array.push(“str1”);
- str_array.push(“str2”);
- str = str_array.join(“”);
这里我们利用数组(array)的“join”方法实现字符串的拼接,尤其是程序的老版本的 Internet Explore(IE6)上运行时,会有非常明显的性能上的改进。
当然,最新的浏览器(如火狐 Firefox3+,IE8+ 等等)对字符串的拼接做了优化,我们也可以这样写:
清单 10. 字符串快速拼接
- str +=“str1”
- str +=“str2”
新的浏览器对“+=”做了优化,性能略快于数组的“join”方法。在不久的将来更新版本浏览器可能对“+”也会做优化,所以那时我们可以直接写:str += “str1” + “str2”。
隐式类型转换
参考如下代码:
清单 11. 隐式类型转换
- var str = “12345678”, arr = [];
- for(var i = 0; i <= s.length; i++){
- arr.push( str.charAt(i));
- }
这里我们在每个循环时都会调用字符串的“charAt”方法,但是由于我们是将常量“12345678”赋值给“str”,所以“str”这里事实上并不是一个字符串对象,当它每次调用“charAt”函数时,都会临时构造值为“12345678”的字符串对象,然后调用“charAt”方法,最后再释放这个字符串临时对象。我们可以做一些改进: