簡體   English   中英

Javascript 是否具有類似於 Java 的增強的 for 循環語法

[英]Does Javascript have an enhanced for loop syntax similar to Java's

我想知道 JavaScript 是否具有增強的 for 循環語法,允許您遍歷數組。 例如,在 Java 中,您可以簡單地執行以下操作:

String[] array = "hello there my friend".split(" ");

for (String s : array){
    System.out.println(s);
}

輸出是:

hello
there
my
friend

有沒有辦法在 JavaScript 中做到這一點? 或者我必須使用array.length並使用標准的循環語法,如下所示?

var array = "hello there my friend".split(" ");

for (i=0;i<array.length;i++){
    document.write(array[i]);
}

JavaScript 有一個foreach風格的循環( for (x in a) ),但是在Array上使用它是非常糟糕的編碼實踐。 基本上, array.length方法是正確的。 您還可以在較新的 JavaScript 中使用a.forEach(fn)方法,但不能保證在所有瀏覽器中都存在它 - 而且它比array.length方法慢。

編輯 2017 年:確實,“我們會看到進展如何”。 現在在大多數引擎中, .forEach()現在與for(;;)一樣快或更快,只要函數是內聯的,即arr.forEach(function() { ... })很快, foo = function() { ... }; arr.forEach(foo) foo = function() { ... }; arr.forEach(foo)可能不是。 有人可能認為兩者應該是相同的,但第一個編譯器比第二個更容易優化。

遲來的 2020 年編輯:現在for (const item of iterable)解決了使用for (item in iterable)的缺點。

使用適用於大多數現代瀏覽器的最新版本的 JavaScript,您可以執行以下操作:

array.forEach(function(x){
  document.write(x);
});

詳細信息位於https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach 如果您擔心瀏覽器可能不支持此功能,您可以使用他們在“兼容性”下列出的(希望縮小的)實現版本自己添加它。

這有點過時了,但這是我幾年前從 Mozilla 頁面派生的forEach的縮小兼容性版本:

if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}};

我從來沒有遇到過任何問題,但是 Mozilla 頁面上的實現已經通過一些額外的檢查和代碼進行了擴展,以使其與 ECMA-262,第 5 版,15.4.4.18 兼容。

我有一個名為common.js的文件,我在我的所有頁面上使用並包含該文件以包含此文件,以及 JavaScript 1.6 中引入的所有其他“Array extras”,如https://developer.mozilla所列.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras (我一直想讓它更新並發布以供公眾使用。)

這可能不是最快的方法(有關某些細節,請參閱http://jsperf.com/for-vs-foreach/15 - 感謝 Amadan 提供的鏈接) - 但對於簡潔性和可維護性等,有一些話要說。此外,在接下來的幾個月和幾年中,通過進一步的 JavaScript 引擎改進,看看這種差異有多少會被優化掉,這將是非常有趣的。 :-)

在 ES2015(ES6) 中,您可以使用for-of循環。 除 IE 外,大多數瀏覽器都支持它。

let array = [10, 20, 30];

for (let value of array) {
  console.log(value);
}

在此處查看 Mozilla 說明

您可以執行for(s in array) ,但要小心,它與foreach

在這種情況下, s是鍵(索引),而不是值。 您還需要使用hasOwnProperty因為in循環中,盡管對象的prototype也是如此。

for(s in array){
    if(array.hasOwnProperty(s)){
        console.log(array[s]);
    }
}

編輯:正如@Amadan 所指出的, hasOwnProperty在像這樣添加時迭代屬性: array.test = function(){} 我建議不要使用for...in

EDIT2:如果您使用現代網絡瀏覽器(任何不是 IE < 9 的瀏覽器),您可以使用Array.forEach @ziesemer 指出,如果您需要支持 IE < 9, Mozilla 有一個墊片

array.forEach(function(s){
    console.log(s);
});

注意:我個人在 JavaScript 項目中使用jQuery ,並使用$.each

$.each(array, function(i,s){
    console.log(s);
});

在較新的 JavaScript 引擎中,Array 原型上有“forEach”方法。 一些庫使用類似的方法擴展原型本身。

試試這個:

 var errorList = new Array();
 errorList.push("e1");
 errorList.push("e2");
      
 for (var indx in errorList) {
     alert(errorList[indx]);
 }
x = [1,2,3];
for (i in x) {
  console.log(i);
}

暫無
暫無

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

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