1、尽量使用变量和常量,减少使用数组和对象成员
2、尽量减少使用动态作用域
- 避免使用with语句
- 由于try-catch也会改变作用域链,最好将错误处理委托给一个函数来处理用以避免catch中过多访问局部/全局变量
- 减少使用eval语句(非常危险)
3、小心使用闭包
- 由于闭包跨越作用域,导致性能下降
- 由于闭包与其关联作用域对象共享活动对象,导致关联对象无法销毁(直到闭包被销毁),这带来额外内存开销,IE中会导致内存泄漏
4、尽量减少使用嵌套成员,最好在一个‘.’操作符就能够访问到对象成员
5、属性或方法在原型链中的位置越深,效率越低,实例成员的访问速度优于原型成员
6、如许多次访问对象成员、数组元素、跨域变量和多级嵌套成员,应尽量使用局部变量替代
7、字符串连接
- 使用+和+=运算符在非IE7及以下版本的浏览器中效率都高于其他方式连接
- 使用+和+=时,尽量将被连接字符串变量放在左边,并且尽量避免产生临时变量
举例如下:
var str = "abc";
str += "def" + "ghi";
由于表达式的从左到右计算的特点,"def"+"ghi"先执行并产生临时字符串"defghi",然后执行str+"defghi";
可以改为:str += str + "def" + "ghi"; 这样执行就是(str + "def") + "ghi",不会产生临时字符串;
当然如果程序如下,也会产生临时字符串:
str = "def" + str + "ghi";
这个将会产生两个临时字符串,"def"+str产生一个,然后其结果和"ghi"的合并还会产生一个;
- IE7及以下版本浏览器中,Array.prototyp.join方法的效率远远高于+和+=,但在其他浏览器中数组连接字符串的效率是最低的
- String.prototyp.concat的效率也稍慢于+和+=
8、使用Object/Array直接量来初始化
- 例如:
var obj = new Object();
obj.name = 'Maculish';
obj.age = 22;
obj.gender = 'M';
var arr = new Array();
arr[0] = 'Maculish';
arr[1] = 22;
arr[2] = 'M';
和以下用直接量创建的对象/数组相比,直接量创建的大小会更小,运行速度会更快
var obj = {
name: 'Maculish',
age: 22,
gender: 'M'
};
var arr = ['Maculish', 22, 'M'];
尤其是要初始化的对象属性越多或数组元素越多,则性能优势越明显。