[英]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);
}
您可以執行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.