[英]for (c in cars) - how does this for-loop work?
我正在編寫一個隨機生成器,該生成器貫穿數組運行,並隨機化數組中的項目,然后將其輸出到HTML。
下面的代碼有效,但是我從各個地方重新使用了它,我想了解一下此for循環的工作原理,特別是,我不知道for (var c in cars)
檢查的目的,並且我嘗試過簡單地替換循環中每個cars
實例,但隨后不輸出任何內容。
這是一個可以正常工作的Codepen: http ://codepen.io/npav/pen/xZXxqe
只是JS:
var cars = 'Tarasenko,Steen,Backes,Stastny,Jaskin,Ott,Brodziak,Upshall,Rattie,Fabbri,Brouwer, Berglund'.split(',');
cars.sort(function() { return 0.5 - Math.random() });
for (var c in cars) {
var newElement = document.createElement('div');
newElement.id = cars[c]; newElement.className = "car";
newElement.innerHTML = cars[c];
document.getElementById("forwards").appendChild(newElement);
}
因此,與使用計數器的標准for
循環不同,它遍歷對象的所有可枚舉鍵。 有不同的方法可以做到這一點。 規范ECMA 262/51 /#sec-12.6.4“ for-in語句”具有這樣的含義 (某些鏈接和引號中的突出顯示部分):
生產IterationStatement:for(表達式中的var VariableDeclarationNoIn)語句的計算方式如下:
- 令varName為評估VariableDeclarationNoIn的結果。
- 令exprRef為計算表達式的結果。
- 令experValue為GetValue(exprRef)。
- 如果experValue為null或未定義,則返回(正常,空,空)。
- 令obj為ToObject(experValue)。
- 令V =空。
重復
一種。 令P為[[Enumerable]]屬性為true的obj的下一個屬性的名稱。 如果沒有這樣的屬性,請返回(正常,V,空)。
b。 令varRef為評估varName的結果,就好像它是一個標識符引用(11.1.2); 它可能會被反復評估。 C。 調用PutValue(varRef,P)。
d。 令stmt為評估Statement的結果。
e。 如果stmt.value不為空,則使V = stmt.value。
F。 如果stmt.type為break且stmt.target在當前標簽集中,則返回(正常,V,空)。
G。 如果stmt.type不繼續|| stmt.target不在當前標簽集中,則
一世。 如果stmt是突然完成,則返回stmt。
沒有指定枚舉屬性的機制和順序(...,第二步中的步驟7.a)。
請注意,我沒有發布整個部分,並且算法是根據您執行for(x in y)
還是for(var x in y)
而有所不同。
既然我還不能發表評論,則您使用for-in循環是錯誤的。 for-in遍歷對象的屬性,並不一定意味着該對象應該是數組。 請看這個
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
根據您的代碼,我建議使用for循環。
for (var i = 0; i < cars.length; i++) {
var newElement = document.createElement('div');
newElement.id = cars[i]; newElement.className = "car";
newElement.innerHTML = cars[i];
document.getElementById("forwards").appendChild(newElement);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.