为什么ECMAScript 5中的Object上没有forEach方法?

时间:2013-02-18 05:05:23

标签: javascript foreach ecmascript-5

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

  • 它更简洁。
  • 它不会创建我们只需要迭代的变量。
  • 它为循环的局部变量创建了一个可见范围。
  • 它提升了表现。

有没有object.forEach替换for(var key in object)的原因?

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

3 个答案:

答案 0 :(得分:75)

嗯,自己很容易装备。为什么要进一步污染原型?

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

我认为一个重要原因是希望避免向Object添加内置属性的权力。 Object是Javascript中所有内容的构建块,但也是该语言中的通用键/值存储。向Object添加新属性会与您的Javascript程序可能要使用的属性名称冲突。因此,在Object添加内置名称时要非常谨慎。

数组由整数索引,因此没有此问题。

这也是我们Object.keys(obj)而不仅仅是obj.keys的原因。污染Object构造函数,因为它通常不是什么大问题,但只留下实例。

答案 1 :(得分:6)

  1. .forEach 创建变量只是为了迭代......不是你自己创建的变量。
    如果你正在使用垫片,那么它们在闭包中是JS变量,否则它们很可能是在C ++中,或者是浏览器的原生实现。

  2. ES6正在获取for ... of,它将遍历您传递的任何内容。

  3. ES6也使用let代替var

  4. 获取块级变量(而非功能范围)
  5. 您将能够将迭代器添加到ES6中的特定类型的对象(即:您构建的对象以支持迭代器)。

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

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

答案 2 :(得分:2)

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

如果您当前看到对象及其方法,则它们仅用于标识对象,或用于区分一个对象。

相关问题