簡體   English   中英

無需重新計算數組長度的循環JavaScript

[英]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循環時重新計算key.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)。 O'Reilly Media。 Kindle版。

您可以像這樣鏈接變量聲明

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++)

一旦鍵解析為undefined,這將導致for循環結束。 現在您可以使用key代替keys[i]

附帶說明一下,您的第二個示例將永遠無法工作,因為第一個for語句中定義的所有變量都將被第二個覆蓋,從而產生意外結果。 您可以嵌套for循環,但是必須使用不同的變量名。

正如Ankit在問題注釋中正確提到的那樣,它是一種簡寫。 而且,如果我是對的,則javascript在功能上是作用域范圍內的,而不是在塊作用域內,因此,您將覆蓋在外層for循環中聲明的len,而在內部中又將其聲明。

每次實例化時,在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
 }

希望能幫助解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM