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]);
}
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);
}
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- 为什么我使用javascript获得了一个无限的for循环
- 从两个基于0的for循环迭代器中获取单个基于0的索引的公式
- JavaScript/Jquery:一个特殊用途的for循环函数
- 使用javascript中的for循环和if语句
- OpenOffice绘图:增强的几何图形解析
- 在 Node.js 中脱离回调函数中的“for”循环
- 页面对象中的 for 循环未正常运行
- 为什么我的“for”循环只获取 html 中的最后一项
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议
- 具有闭合功能的 For 循环保存状态
- Javascript破坏了回调函数内部的for循环
- 用于逐步增强的“select”元素的JavaScript中的事件处理程序
- 如何使用javascript中的for循环成对检索数组元素
- Internet Exporer中的for循环没有值
- 从 Javascript 中的 'for' 循环返回所有值
- 使用javascript中的for循环在画布上绘制路径
- Javascript:connection.query函数正在破坏我的for循环
- 从数组中删除项目,为什么输出中的 for 和 for 不同
- Javascript是否有类似于Java的增强的for循环语法