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

Javascript for loop without recalculating array's length

在我的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 循环,这不是很好吗?

例如

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 位置 6992-6998)。奥莱利媒体。 Kindle版。

在Javascript中每次实例化都是一个沉重的代价。使用一个 var 和简写逗号创建多个变量效率更高。

您的示例仅使用一个 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
 }

希望对解释有所帮助。

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

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 语句覆盖,从而产生意外结果。可以嵌套for循环,但是必须使用不同的变量名。

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