【问题标题】:Javascript forEach to loop n timesJavascript forEach 循环 n 次
【发布时间】:2015-09-15 15:34:06
【问题描述】:

我知道 forEach 的性能不是很好,但我正在尝试使用它(只是一个学习练习)来循环一些 (n) 次。

我正在尝试这个,但我无法让它工作:

var i = 0;
new Array(10).prototype.foreach.call( function(){ i++; } );

可以这样使用吗?我的代码有什么问题?谢谢!

【问题讨论】:

  • 您在哪里看到forEach 的性能不是很好?它基本上只是一个底层的 for 循环。
  • @Cᴏʀʏ 这里,假设使用了一个简单的forEach:jsperf.com/for-vs-foreach/9
  • 有趣的是,在 Firefox 中,forEach 比常规的 for 循环快(大约 1%);在 IE 中,它慢了 45%。疯狂的 IE。

标签: javascript loops foreach


【解决方案1】:

在内部,您可以将forEach 定义为:

Array.prototype.forEach = function(cb) {
    for( var i=0, l=this.length; i<l; i++) {
        cb(this[i]);
    }
}

请注意,这只是一个基本示例,它并不完全正确 XD 但对于我要表达的观点来说已经足够了。即this

通常,this 是您正在处理的数组。但是通过您拨打的.call()this === function(){ i++; }。函数的 length 是它接受的参数数量,在您的情况下为零,因此代码永远不会运行。即使这样做(例如function(x){ i++; }),函数内的代码也不会运行,因为那必须是.call()第二个 参数(它成为.forEach() 的第一个参数) )

试试这个:

[].forEach.call(new Array(10), function() {i++;});

这会获取forEach 方法,将其调用on 长度为10 的数组,将函数作为回调参数传递。

我在上面说错了。 new Array(10) 无法按您希望的方式工作。你需要一些像Array.apply(null, Array(10)).map(function () {}) 这样的黑客来获得forEach 可以处理的数组。你最好只使用for

【讨论】:

  • 哇,这种方法太疯狂了。你说得对,我最好用for
  • 它实际上是 forEach 不能按你想要的方式工作。它会跳过 undefined 元素并 new Array(10) 创建一个包含 10 个 undefineds 的数组
【解决方案2】:

如果您想使用 forEach 而不是 for 循环,您可以创建一个包含 n 个项目的空数组。

let i = 0;
[...Array(10)].forEach(() => {
    i++
});

也可以获取索引:

[...Array(10)].forEach((_, i) => {
  console.log('index: ', i);
});

for 比 forEach 快,但通常首选 forEach,因为您不会因 n 个错误而失败,而且速度差异可以忽略不计,除非您处理大量迭代。如果您正在处理大量迭代,那么您真的不应该使用 JavaScript。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多