Javascript for循环而不重新计算数组的长度

时间:2015-05-23 05:27:04

标签: javascript arrays loops for-loop syntax

在我的Javascript参考书中,for循环以下列方式进行优化:

for( var i = 0, len = keys.length; i < len; i + +) { BODY }

显然,执行“len = keys.length”会阻止计算机每次通过for循环时重新计算keys.length。

我不明白为什么这本书不写“var len = keys.length”而不是“len = keys.length”?是不是这本书使“len”成为一个全局变量,如果你试图嵌套两个循环遍历两个数组的for循环,这不好?

E.g。

for( var i = 0, len = keys.length; i < len; i + +) { 
     for (var i = 0; len = array2.length; i < len; i++) {
     }
}

来源:弗拉纳根,大卫(2011-04-18)。 JavaScript:权威指南:激活您的网页(权威指南)(Kindle Locations 6992-6998)。奥莱利媒体。 Kindle版。

3 个答案:

答案 0 :(得分:1)

您可以像这样链接变量声明

var i = 0, foo="bar", hello = "world"

接近
var i = 0;
var foo = "bar";
var hello = "world";

所以这个

for(var i = 0, len = keys.length; i < len; i++)

相同
var len = keys.length;
for(var i = 0; i < len; i++)

我喜欢完全避免使用.length并使用类似

的内容
var keys = /* array or nodelist */, key, i;
for(i = 0; key = keys[i]; i++)

一旦键解析为未定义,这将导致for循环结束。 现在,您可以使用key代替keys[i]

作为旁注,您的第二个示例将永远不会起作用,因为第一个for语句中定义的所有变量都将被第二个覆盖,从而产生意外结果。您可以嵌套for循环,但必须使用不同的变量名称。

答案 1 :(得分:0)

AS Ankit在问题的评论中正确提到,它是一种速记。而且,如果我是正确的,javascript是功能范围的,而不是块作用域,所以你覆盖外部for循环中声明的len,同时在内部重新声明它。

答案 2 :(得分:-1)

在Javascript中,每次实例化它都是一笔沉重的代价。使用一个var和short hand逗号来创建多个变量会更有效。

您的示例仅使用一个var来创建变量。

 for (var i = 0, len = array2.length; i < len; i++) {
      //loop
 }

另一种方法是在循环外变换len变量。

 var len = array2.length; 
 for (var i = 0; i < len; i++) {
      //loop
 }

现在您有两个单独的“var”实例。

我个人喜欢在开头宣布我的var。

 var len = array2.length,
     i = 0;

 for(i = 0; i < len; i++){
      //First loop
 }

 //So if I use more than one for loop in a routine I can just reuse i
 for(i = 0; i < 10; i++){
      //Second loop
 }

希望有助于解释。