ECMAScript 5的array.forEach(callback[, thisArg])
非常方便迭代一个数组,并且与for语法相比具有许多优势:
有没有object.forEach
替换for(var key in object)
的原因?
当然,我们可以使用JavaScript实现,例如_.each或$ .each,但这些都是性能杀手。
答案 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)
.forEach
创建变量只是为了迭代......不是你自己创建的变量。
如果你正在使用垫片,那么它们在闭包中是JS变量,否则它们很可能是在C ++中,或者是浏览器的原生实现。
ES6正在获取for ... of
,它将遍历您传递的任何内容。
ES6也使用let
代替var
您将能够将迭代器添加到ES6中的特定类型的对象(即:您构建的对象以支持迭代器)。
但问题在于,ES5旨在保留ES3的大多数语法(很少有新关键字,而且常规使用中没有新关键字)。
大多数附加功能必须是方法调用(通常是原型)
考虑到自ES3推出以来JS已经有多少使用,数组需要大量的工作。
对象不需要.map()
/ .reduce()
能力,除非您正在构建非常具体的对象,在这种情况下,您自己实现这些对象。
答案 2 :(得分:2)
你必须记住,javascript中的每个对象都继承自Object
。并非javascript中的每个对象都需要迭代它的属性。这些主要局限于数据模型对象。添加forEach方法只会不必要地增加每个对象的原型。
如果您当前看到对象及其方法,则它们仅用于标识对象,或用于区分一个对象。