Javascript优化总结

Javascript中声明变量速度的研究

声明变量到底要不要var

使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误。

如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色。

如果重复使用的一个声明没有一个初始值,那么它不会对原来存在的变量有任何的影响。

没有var声明的变量,是作为全局变量存在的;有var声明的变量,属于局部变量,尤其是在函数内部。并且,经过测试,带var声明比不带var速度要快,比如:”var
a”比”a”具有更快的执行速度。我们有理由推测,局部变量的声明比全局变量的声明效率更高。

直接量与new

变量有好几种类型,但是同一类型的变量创建的方式可能不一样,比如string、Object、Array等这些类型的变量声明或者创建。

经过测试,通过直接量声明的速度明显快于通过new声明的速度,比如”var a={} “比”var a=new Object()”具有更快的执行速度。

局部变量与全局变量

现在笔者来告诉你,函数内尽量多设局部变量,这样即安全又快速,变量操作也更加合理,不会因为函数内胡乱操作全局变量而导致逻辑错误。

写个例子说明下,先建立一个全局变量:var m=1; ,接着我读取这个全局变量1000000次

全局变量:

1
2
3
for(var i=1000000;i--;)

{a=m;}

局部变量:

1
2
3
4
5
6
7
8
9
(function (){

    var n=m;

    for(var i=1000000;i--;)

    {a=n;}

})();

执行速度2>1

通过上面测试表明,先将m这个全局变量的值存给局部变量n,在将n赋值给a具有更快的速度。

变量名长度

变量名是自己取的,为了照顾语义和规范,变量名可能稍长,但是注意了,变量名的长度也会影响代码的执行速度。

经过测试,长的变量名声明的执行速度没有短的快,比如”var a=1”比”var
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1”具有更快的执行速度。

所以,我们在声明变量的时候,尽量缩写一些单词,并记忆一些常见的缩写,以下是缩写示例:

单词 缩写
array(数组) arr
string(字符串) str
number(数量/数字) num
function(函数) fun
message(消息/信息) mes
userNumber(会员数量) userNum/uNum
parentElement(父级节点/父级元素) parentEle
returnArray(返回的数组) returnArr

优化JS中的条件分支语句

一、将条件分支,按可能性顺序从高到低排列

说明:可以减少解释器对条件的探测次数。

二、在同一条件子的多(>2)条件分支时,使用switch优于if

说明:switch分支选择的效率高于if,在IE下尤为明显。4分支的测试,IE下switch的执行时间约为if的一半。

三、使用三目运算符替代条件分支

使用前:

1
2
3
4
5
6
7
if (a > b)

{ num = a; }

else

{ num = b; }

使用后:

1
num = a > b ? a : b;

字符串拼接

如果要连接多个字符串,应该少使用+=,如

1
2
3
4
5
s+=a;

s+=b;

s+=c;

应该写成s+=a + b + c;

而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存,使用JavaScript数组来收集,最后使用join方法连接起来

1
2
3
4
5
6
7
8
9
var buf = [];

        for (var i = 0; i < 100; i++) {

            buf.push(i.toString());

        }

        var all = buf.join("");

数字转成字符串

一般最好用”” + 1来将数字转换成字符串,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:

(“” +) > String() > .toString() > new String()


  • for()语句性能优于for(…in…)语句

  • 避免重复创建函数,避免使用闭包。推荐使用prototype追加方法

  • 使用{}创建对象

  • 使用[]创建数组,如果你不知道数组长度,使用Array#push。当你需要复制数组的时候,请使用Array#slice

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×