我看到很多建议使用的问题:
for (var i = 0; i < myArray.length; i++){ /* ... */ }
代替:
for (var i in myArray){ /* ... */ }
对于数组,由于迭代不一致(see here https://stackoverflow.com/questions/242841/javascript-for-in-vs-for).
但是,我似乎找不到任何似乎更喜欢面向对象循环的东西:
myArray.forEach(function(item, index){ /* ... */ });
这对我来说似乎更直观。
对于我当前的项目,IE8 兼容性很重要,我正在考虑使用Mozilla 的 polyfill https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill,但是我并不能 100% 确定这将如何工作。
- 标准 for 循环(上面的第一个示例)和现代浏览器的 Array.prototype.forEach 实现之间有什么区别吗?
- 现代浏览器实现和上面链接的 Mozilla 实现(特别是 IE8)之间有什么区别吗?
- 性能并不是什么大问题,只是迭代属性的一致性才是问题。
两者之间最本质的区别for
循环和forEach
方法是,对于前者,你可以break
跳出循环。你可以模拟continue
通过简单地从传递给的函数返回forEach
,但没有办法完全停止循环。
除此之外,两者有效地实现了相同的功能。由于变量提升,另一个细微差别涉及 for 循环中索引(以及所有包含变量)的范围。
// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }
// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });
然而,我发现forEach
更具表现力 - 它代表您迭代数组中每个元素的意图,并且它为您提供对元素的引用,而不仅仅是索引。总的来说,这主要取决于个人品味,但如果你可以使用forEach
,我建议使用它。
这两个版本之间存在一些更实质性的差异,特别是在性能方面。事实上,简单的 for 循环的性能比forEach
方法,如所证明的这个 jsperf 测试 http://jsperf.com/for-vs-foreach/66.
您是否需要这样的性能取决于您自己的决定,在大多数情况下,我更喜欢表现力而不是速度。这种速度差异可能是由于在稀疏数组上操作时基本循环和方法之间存在细微的语义差异,如这个答案 https://stackoverflow.com/a/18884620/465378.
如果你不需要以下行为forEach
和/或者你需要尽早跳出循环,你可以使用 Lo-Dash 的_.each http://lodash.com/docs#forEach作为替代方案,它也可以跨浏览器工作。如果您使用 jQuery,它还提供了类似的$.each http://api.jquery.com/jquery.each/,只需注意每个变体中传递给回调函数的参数的差异即可。
(至于forEach
polyfill,如果您选择走这条路,它应该可以在旧版浏览器中正常工作。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)