我想知道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
并使用标准for循环语法,如下所示?
var array = "hello there my friend".split(" ");
for (i=0;i<array.length;i++){
document.write(array[i]);
}
答案 0 :(得分:22)
JavaScript有一个foreach
- 样式循环(for (x in a)
),但在Array
上使用它是非常糟糕的编码习惯。基本上,array.length
方法是正确的。您可以使用较新的JavaScripts中的a.forEach(fn)
方法,但并不保证它存在于所有浏览器中 - 并且它比array.length
方式慢。
编辑2017 :“我们会看到它如何发展”,的确如此。现在,在大多数引擎中,.forEach()
现在比for(;;)
更快或更快,只要函数是内联的,即arr.forEach(function() { ... })
很快,foo = function() { ... }; arr.forEach(foo)
可能不是。{{1}}。有人可能会认为两者应该是相同的,但第一种方法比第二种更容易使编译器优化。
答案 1 :(得分:8)
使用大多数现代浏览器可用的最新版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”,如{{{ 3}}。 (我一直想将此更新并发布供公众使用。)
这可能不是最快的方法(有关详细信息,请参阅https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras - 感谢链接,Amadan) - 但有一些内容可以说明简洁性和可维护性等。此外,它会非常有趣的是,在接下来的几个月和几年中,通过进一步的JavaScript引擎改进,有多少这种差异被优化了。 : - )
答案 2 :(得分:3)
你可以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&lt; 9的东西),你可以使用Array.forEach
)。如果你需要支持IE&lt; @ziesemer,请指出Mozilla has a shim。 9。
array.forEach(function(s){
console.log(s);
});
注意:我个人使用jQuery作为我的JavaScript项目,并使用$.each
。
$.each(array, function(i,s){
console.log(s);
});
答案 3 :(得分:3)
在ES2015(ES6)中,您可以使用for-of
循环。它在大多数浏览器中都受支持,IE除外。
let array = [10, 20, 30];
for (let value of array) {
console.log(value);
}
答案 4 :(得分:2)
在较新的JavaScript引擎中,Array原型上有“forEach”方法。一些库使用类似的方法扩展原型。
答案 5 :(得分:1)
x = [1,2,3];
for (i in x) {
console.log(i);
}
答案 6 :(得分:1)
试试这个,
var errorList = new Array();
errorList.push("e1");
errorList.push("e2");
for (var indx in errorList){
alert(errorList[indx]);
}