我已经看到很多建议使用的问题:
for (var i = 0; i < myArray.length; i++){ /* ... */ } 代替:
for (var i in myArray){ /* ... */ } 对于数组,由于迭代不一致(请参见此处)。
但是,我似乎找不到任何似乎更喜欢面向对象循环的东西:
myArray.forEach(function(item, index){ /* ... */ }); 对我来说,这似乎更直观。
对于我当前的项目,IE8的兼容性很重要,我正在考虑使用Mozilla的polyfill,但是我不确定100%如何工作。
现代浏览器的for循环标准(上面的第一个示例)与Array.prototype.forEach实现之间是否有区别? 现代浏览器实现与上面链接到的Mozilla的实现(特别是IE8)之间是否有区别? 性能并不是问题,只是迭代属性的一致性。 问题来源于stack overflow
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,我建议您使用它。
这两个版本之间还有一些实质性差异,特别是在性能方面。实际上,forEach如本jsperf测试所示,简单的for循环的性能要比方法好得多。
是否需要这种性能取决于您自己决定,在大多数情况下,我倾向于表现力胜于速度。此速度差异可能是由于在稀疏数组上进行操作时基本循环与方法之间的较小语义差异所致,如本答案所述。
如果您不需要行为forEach和/或需要尽早突破循环,则可以使用Lo-Dash _.each作为替代,它也可以跨浏览器工作。如果您使用的是jQuery,它还提供了一个类似的$.each,只需注意每个变体中传递给回调函数的参数的差异。
(对于forEachpolyfill,如果您选择使用那条路线,它应该可以在较旧的浏览器中正常工作。)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。