的ECMAScript 5的array.forEach(callback[, thisArg])
是非常方便的迭代的阵列上,并具有许多优势的语法与为:
- 它更简洁。
- 它不创造,我们只需要迭代的目的变量。
- 这是创建循环的局部变量能见度范围。
- 它提升了性能。
是否有一个原因是没有object.forEach
更换for(var key in object)
?
当然,我们可以使用JavaScript实现,像_.each或$。每次但这些都是性能杀手。
的ECMAScript 5的array.forEach(callback[, thisArg])
是非常方便的迭代的阵列上,并具有许多优势的语法与为:
是否有一个原因是没有object.forEach
更换for(var key in object)
?
当然,我们可以使用JavaScript实现,像_.each或$。每次但这些都是性能杀手。
嗯,这是很容易来搭起自己。 为什么要进一步污染的原型?
Object.keys(obj).forEach(function(key) {
var value = obj[key];
});
我认为,一个很大的原因是,这是权力要避免增加内置的属性Object
。 Object
s为在Javascript中一切的基石,但也都在语言类属键/值存储。 添加新的属性Object
将与你的JavaScript程序可能要使用属性名称冲突。 所以加入内置名字Object
是极其谨慎进行。
阵列由整数索引的,所以它不会有这个问题。
这也是为什么我们有Object.keys(obj)
而不是简单地obj.keys
。 污染Object
构造函数,它通常不是一个大问题,但独自离开的情况。
.forEach
不创建变量只是迭代的目的...你创建,自己只是没有的。
如果您使用的垫片,那么他们是在一个封闭的JS变量,否则他们很可能在C ++,或任何浏览器的原生实现。
ES6越来越for ... of
穿过无论你通过它会遍历。
ES6也越来越块级变量(而不是函数范围的),采用let
,而不是var
您将可以迭代器添加到特定类型的对象在ES6(即:构建支持迭代的对象)。
但这里的问题是,ES5是为了维护大多数ES3的语法(几个新的关键字,并没有新的关键字经常使用)。
大多数附加功能必须是方法调用(原型,典型值)。
和阵列需要大量的工作,因为自ES3推出了使用JS也多少看到。
对象不需要.map()
/ .reduce()
的能力,除非你正在构建非常具体的对象,在这种情况下,你实现这些自己。
你要记住,在JavaScript中的每个对象从继承Object
。 并不是每一个对象在JavaScript中需要有它的属性重复。 这些大多局限于数据模型对象。 添加在foreach方法将只不必要地批量每隔对象的原型。
如果您目前看到的对象和它的方法,它们是目前唯一识别的对象或一个对象与另一个区分。