Guideline-编写有效率的javascript代码
Trust yourself, not the VM。
- 对象的初始化顺序
function Point(x, y) {
this.x = x;
this.y = y;
}
var p1 = new Point(11,12);
var p1 = new Point(33,34);
Checklist:
-
成员变量写在构造函数内
-
不要在其他地方任意添加成员变量或者方法
Why:
每当有新变量添加的时候, 编译器会生成一个新的隐藏类。
- 整数变量的使用
var a = 1;
...
a = 1.5;
...
a = 'abcd';
Checklist:
- a变量的重新赋值会引起 object a在内存中的被重新 allocation
- 数组的用法
Checklist:
- 使用从0开始的连续下标
a[5000] = 1;
上面表达式将促使编译器把变量a转化为一个字典类型
- 不要删除数组中的元素,特别是numberic类型
var data = [1,2,3,4];
delete data[2];
上面delete表达式会促使编译器把data转化为dictionary。
- 不要使用未初始化的数组元素
var a = [];
for(var i = 0; i < 10; i ++) {
a[0] = i; //
}
var a = [];
a[0] = 0; // ⬲⬲ 至少快2倍
for(var i = 0; i < 10; i ++) {
a[0] = i; //
}
- 注意数组元素的类型转化
// First step
var a = new array();
a[0] = 77;
a[1] = 88;
// Second step
a[2] = 0.5;
// Third step
a[3] = true
更好的方法:
//一次性初始化
var data = [1,2,0.5, true];
- 方法的使用
充分利用IC(inline cache)
Checklist:
- 避免多态
function add(x, y) {
return x + y;
}
add(1, 2) // 生成单态隐藏类 monomorphic
add("a","b") // 多态 polymorphic
总结
没有规矩的javascript代码就像是一碗缠在一起面条,剪不断,理还乱。
不要让prototype嵌套的太深。
参考
Google I/O 2012 - Breaking the JavaScript Speed Limit with V8