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,同时在内部循环中重新声明它。
在我的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,同时在内部循环中重新声明它。