V8引擎 for-in与for循环遍历数组性能比较

不知道由于什么原因,很多人误认为for的效率一定会比for-in要高.

在JavaScript中也是如此,个人认为是受《高性能JavaScript》这本书的影响.

在IT界生存,你必须知道”与时俱进”这四个字,书中的理论很可能已经不符合当前的现实,所以要学会自己去分析.

至今国内还有一些奉此书为圣经的初学者,着实令人无奈.

下面用市场份额接近20%的Chrome浏览器所使用的JavaScript引擎V8来进行测试,代码非常简单清晰:

function getMS(s) {  
    if(this.a) {
        console.log(s);
        console.log((new Date) - this.a);
        this.a = undefined;
    } else {
        this.a = (new Date).getTime();
    }
}

var arr = new Array(10000000);

getMS('for')  
for(var i = 0; i < arr.length; i++) {  
    arr[i] = 1;
}
getMS('for')

getMS('for-in');  
for(var i in arr) {  
    arr[i] = 1;
}
getMS('for-in');  

结果为:

for
24781

for-in
18345

结论:在Chrome的V8引擎中for-in比for快1.3倍.

同样的,也绝对不要把在V8引擎中for-in比for快奉为真理,因为一切都在变化,版本的不同,浏览器的不同,都会对结果造成影响,在你不知道它们的底细之前,所需要做的就是多测试.

比如下面这个for倒序循环:

getMS('for')  
for(var i = arr.length; i--;) {  
    arr[i] = 1;
}
getMS('for')  

它能比for-in要快1.1倍,所以,凡事无绝对,不要人云亦云.