Javascript是否具有类似于Java的增强的for循环语法

时间:2011-12-30 16:25:51

标签: javascript for-loop iterator

我想知道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]);
}

7 个答案:

答案 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);
}

ocaml-webmachine

答案 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]);
          }