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

Why is there no forEach method on Object in ECMAScript 5?

本文关键字:forEach 方法 Object ECMAScript 为什么      更新时间:2023-09-26

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

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

为什么没有object.forEach来代替for(var key in object)

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

好吧,你自己组装起来很容易。为什么要进一步污染原型?

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

我认为一个很大的原因是当权者希望避免在Object中添加内置属性。Object是Javascript中所有内容的构建块,但也是该语言中的通用键/值存储。向Object添加新属性将与Javascript程序可能要使用的属性名称冲突。因此,在Object中添加内置名称时要格外小心。

数组是由整数索引的,所以它没有这个问题。

这也是为什么我们有Object.keys(obj)而不是简单的obj.keys。污染Object构造函数,因为这通常不是什么大不了的事情,但不要使用实例。

  1. .forEach创建变量只是为了迭代。。。只是不是你自己创造的
    如果你使用的是填充程序,那么它们是闭包中的JS变量,否则它们可能是C++中的,或者浏览器的本地实现是什么

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

  3. ES6还使用let而不是var 获取块级变量(而不是函数范围的)

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

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

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

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

如果您当前看到对象及其方法,则它们的出现只是为了识别对象,或将一个对象与另一个对象区分开来。