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

Sam*_*lle 37 javascript foreach ecmascript-5

ECMAScript 5 array.forEach(callback[, thisArg])在迭代数组上非常方便,并且具有许多优于语法的优点:

  • 它更简洁.
  • 它不会创建我们只需要迭代的变量.
  • 它为循环的局部变量创建了可见范围.
  • 它提升了性能.

有没有理由不object.forEach替换for(var key in object)

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

Ale*_*yne 77

嗯,这很容易装配自己.为什么进一步污染原型?

Object.keys(obj).forEach(function(key) {
  var value = obj[key];
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 但是拥有`Object.forEach`(不是原型)会很好. (24认同)
  • 它会的,我同意:) (5认同)
  • 它没有污染恕我直言.它被称为一致性.其他语言也有,JS是该板块中最糟糕的一种.在diff类型上完成的Simmilar动作和转换在逻辑上有所不同,并且具有完全差异的语法.如果你有条理的话,你必须吃掉一个最大的废话,JS会把你搞砸 (3认同)

Nor*_*ard 6

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

  2. ES6正在逐渐for ... of通过它传递的任何内容.

  3. ES6也使用let而不是使用块级变量(而不是函数作用域)var

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

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

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