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

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

本文关键字:增强的 for 循环 语法 Java 是否 类似于 Javascript      更新时间:2023-09-26

我想知道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)可能不是。有人可能会认为两者应该是相同的,但第一个比第二个更容易让编译器优化。

迟来的编辑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引入的所有其他"数组附加功能",如 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);
}