为什么会出现在ECMAScript中5上的对象没有的forEach方法?(Why is there

2019-08-17 01:27发布

的ECMAScript 5的array.forEach(callback[, thisArg])是非常方便的迭代的阵列上,并具有许多优势的语法与为:

  • 它更简洁。
  • 它不创造,我们只需要迭代的目的变量。
  • 这是创建循环的局部变量能见度范围。
  • 它提升了性能。

是否有一个原因是没有object.forEach更换for(var key in object)

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

Answer 1:

嗯,这是很容易来搭起自己。 为什么要进一步污染的原型?

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

我认为,一个很大的原因是,这是权力要避免增加内置的属性ObjectObject s为在Javascript中一切的基石,但也都在语言类属键/值存储。 添加新的属性Object将与你的JavaScript程序可能要使用属性名称冲突。 所以加入内置名字Object是极其谨慎进行。

阵列由整数索引的,所以它不会有这个问题。

这也是为什么我们有Object.keys(obj)而不是简单地obj.keys 。 污染Object构造函数,它通常不是一个大问题,但独自离开的情况。



Answer 2:

  1. .forEach 创建变量只是迭代的目的...你创建,自己只是没有的。
    如果您使用的垫片,那么他们是在一个封闭的JS变量,否则他们很可能在C ++,或任何浏览器的原生实现。

  2. ES6越来越for ... of穿过无论你通过它会遍历。

  3. ES6也越来越块级变量(而不是函数范围的),采用let ,而不是var

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

但这里的问题是,ES5是为了维护大多数ES3的语法(几个新的关键字,并没有新的关键字经常使用)。
大多数附加功能必须是方法调用(原型,典型值)。
和阵列需要大量的工作,因为自ES3推出了使用JS也多少看到。

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



Answer 3:

你要记住,在JavaScript中的每个对象从继承Object 。 并不是每一个对象在JavaScript中需要有它的属性重复。 这些大多局限于数据模型对象。 添加在foreach方法将只不必要地批量每隔对象的原型。

如果您目前看到的对象和它的方法,它们是目前唯一识别的对象或一个对象与另一个区分。



文章来源: Why is there no forEach method on Object in ECMAScript 5?