40

ECMAScript 5array.forEach(callback[, thisArg])对数组的迭代非常方便,并且与使用 for 的语法相比具有许多优势:

  • 它更简洁。
  • 它不会创建我们仅用于迭代目的的变量。
  • 它为循环的局部变量创建了一个可见范围。
  • 它提高了性能。

没有object.forEach更换的原因是什么for(var key in object)

当然,我们可以使用 JavaScript 实现,例如 _.each 或 $.each,但它们是性能杀手。

4

3 回答 3

81

好吧,自己装起来很容易。为什么要进一步污染原型?

Object.keys(obj).forEach(function(key) {
  var value = obj[key];
});

我认为一个重要的原因是想要避免将内置属性添加到Object. Objects 是 Javascript 中所有内容的构建块,但也是该语言中的通用键/值存储。添加新属性Object会与您的 Javascript 程序可能想要使用的属性名称冲突。因此,在添加内置名称时要Object格外小心。

数组是由整数索引的,所以它没有这个问题。

这也是我们有Object.keys(obj)而不是简单的原因obj.keys。污染Object构造函数,因为它通常没什么大不了的,但不要管实例。

于 2013-02-18T05:18:59.510 回答
6
  1. .forEach 确实创建变量只是为了迭代......只是不是你自己创建的。
    如果您使用 shim,那么它们是闭包中的 JS 变量,否则它们可能是 C++ 或任何浏览器的本机实现。

  2. ES6for ... of将遍历您传递的任何内容。

  3. letES6 还使用, 而不是获取块级变量(而不是函数范围)var

  4. 您将能够在 ES6 中将迭代器添加到特定类型的对象(即:您构建以支持迭代器的对象)。

但这里的问题是 ES5 旨在保留 ES3 的大部分语法(很少有新关键字,并且在常规使用中没有新关键字)。
大多数附加功能必须是方法调用(通常是原型)。
考虑到自 ES3 推出以来 JS 的使用量越来越大,数组需要做大量工作。

对象不需要.map()/.reduce()能力,除非您正在构建非常特定的对象,在这种情况下,您正在自己实现这些对象。

于 2013-02-18T05:28:14.640 回答
2

您必须记住,javascript 中的每个对象都继承自Object. 并非 javascript 中的每个对象都需要对其属性进行迭代。这些主要限于数据模型对象。添加 forEach 方法只会不必要地增加每个对象的原型。

如果您当前看到 Object 及其方法,它们的存在只是为了识别对象,或将一个对象与另一个对象区分开来。

于 2013-02-18T05:21:27.603 回答