2012-08-03 96 views
0

可能重複不同:
JavaScript for…in vs for什麼是循環之間的循環中在javascript

我使用的是在我的函數循環。我使用兩種類型的循環,「for in」和「for」。兩者都產生相同的結果,所以我想知道這些循環之間有什麼區別,以及如何知道應該使用哪個循環。

<script type="text/javascript"> 
var jam = ['amit','sam','ram','soly'] 
for(var i in jam){ 
alert(jam[i]) 
} 
//for (i=0; i<jam.length; i++) { 
// jam[i] 
//alert(jam[i].length) 
//} 
</script> 
</head> 
<body> 
</body> 

回答

1

這取決於你需要什麼。我通常使用for-in循環,因爲它是一種較短的形式,但有時您可能想要控制迭代變量。舉例來說,如果你想遍歷甚至指數,你需要使用正常的循環:

for (var i = 0; i < myarray.length; i+=2) {...} 

同樣適用,例如,如果你想向後遍歷:

for (var i = myarray.length-1; i >= 0; i--) {...} 

當然,對於對象,for-in循環允許您在迭代變量中獲取屬性名稱。例如:

var myobject = {year: 1992, city: "Barcelona"} 
for (var propname in myobject) alert(propname + " = " + myobject[propname]); 

在你的例子中,我會使用for-in,因爲你正在做一個簡單的迭代。此外,我認爲在非優化的Javascript編譯器/解釋器中,for-in循環會更快,因爲可變增量是在內部完成的(即它不是一個Javascript語句,如「i ++」)。

+0

在這個循環中找不到一個在for循環之外的對象鍵值的變量,因此我建議在這種情況下使用for-in-loop。 – 2018-02-02 15:17:33

2

你可以使用你清楚理解的任何一個。對於數組,您可以使用這兩種情況。

的陣列可以使用

for (var i = 0; i < a.length; i++){ 
    //do something 
} 

的對象,你可以使用

for (var i in obj){ 
    //do something 
} 

因爲你不能得到物體的長度。

2

for循環指的是iterate,同時遞增/遞減。

// note that I'm making this big and ugly to show what's going on 
var incrementor = 1, length = 10, 
    array = [ "one", "two", "three", "four", "five", 
       "six", "seven", "eight", "nine", "ten" ]; 

for (; incrementor <= length; incrementor = incrementor + 1) { 
    console.log(incrementor); // 1,2,3,...,10 
    console.log(array[incrementor - 1]); // "one", "two", "three", ..., "ten" 
} 

for ... in ...迴路通過對象屬性意味着enumerate

var object = { "key1" : "one", "key2" : "two", "key3" : "three" }, 
    key = ""; 

for (key in object) { 
    console.log(key); // "key1", "key2", "key3" 
    console.log(object[key]); // "one", "two", "three" 
} 

您使用for數組的原因是因爲糟糕的瀏覽器,for ... in ...不僅包括數量的屬性(即:key=0, key=1,...),但它也可以通過枚舉的東西,你不希望它.. ... ...就像key=splice, key=length, key=unshift。 如果您在專業網站上運行此代碼,或者在特定硬件上運行JS的特定版本,或者在Unity或Unreal Editor的UnrealScript等程序中作爲腳本語言運行,那麼這不是一件好事。

的原因你沒有使用對象上的iterator是因爲你通常不會做出這樣的對象:

var obj = { "0" : "zero", "1" : "one", "2" : "two" }; 

而且即使你沒有(jQuery不會這樣的事情,例如),有可能是你想枚舉的基於單詞的屬性,但你不能,因爲你在計數。

同樣重要的是要注意:enumeratingfor ... in ...其功能沒有標準化。 這意味着它不是100%保證按預期的順序吐出數值。 如果你依靠你的循環去0,1,2,3,...那麼for ... in ...不能保證100%的瀏覽器將會這樣做,100%的時間 - 即使大多數瀏覽器在大多數時間都適用。

最經常的是,他們現在依靠先入先出的原則。 如果您構建的對象類似{ one : 1, two : 2, three : 3 },則任何現代瀏覽器都會打印1,2,3。如果您構建的對象如下:{ two: 2, one: 1, six: 6 },您將獲得2,1,6

但是,這是95%的時間「應該」,而不是100%的時間「將」。