繁体   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