簡體   English   中英

for(汽車中的c)-此for循環如何工作?

[英]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)語句的計算方式如下:

  1. 令varName為評估VariableDeclarationNoIn的結果。
  2. 令exprRef為計算表達式的結果。
  3. 令experValue為GetValue(exprRef)。
  4. 如果experValue為null或未定義,則返回(正常,空,空)。
  5. 令obj為ToObject(experValue)。
  6. 令V =空。
  7. 重復

    一種。 令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.

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