【问题标题】:Why is there no forEach method on Object in ECMAScript 5?为什么 ECMAScript 5 中的 Object 上没有 forEach 方法?
【发布时间】:2013-02-02 12:01:25
【问题描述】:

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

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

没有object.forEach来代替for(var key in object)有什么原因吗?

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

【问题讨论】:

  • 这个问题更适合参与讨论 ES5/ES6 的人。
  • 为什么for-in 需要替换?为什么Object.forEach 也不会成为性能杀手?命中主要来自于调用回调函数。

标签: javascript foreach ecmascript-5


【解决方案1】:

嗯,安装自己很容易。为什么要进一步污染原型?

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

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

数组是用整数索引的,所以不存在这个问题。

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

【讨论】:

  • 但是拥有Object.forEach(不在原型中)会很好。
  • 它没有污染恕我直言。这叫做一致性。其他语言也有,JS 是该板上最差的语言之一。在不同类型的类型上完成的类似操作和转换在逻辑上是不同的,并且具有完全不同的语法。如果你头脑有条理,你必须吃的最大的废话,JS会把你搞砸
  • “为什么要进一步污染原型?”为什么要改进?这个答案没有帮助。
【解决方案2】:
  1. .forEach确实创建变量只是为了迭代...而不是您自己创建的变量。
    如果您使用 shim,则它们是闭包中的 JS 变量,否则它们可能是 C++ 或任何浏览器的本机实现。

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

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

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

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

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

【讨论】:

  • for...in 迭代任何东西。至于for...of,只会遍历Iterables
  • @theFreedomBanana 是的,自五年前编写此答案以来,for...of 的预期行为发生了很大变化。这是在很多人还在使用obj.hasOwnProperty(key) 时编写的。 for...of 的最初讨论是涵盖数组和对象,并且对它们都做正确的事情。我会考虑更新它,今晚某个时间。
【解决方案3】:

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

如果您当前看到对象及其方法,它们的存在只是为了识别对象,或区分一个对象与另一个对象。

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 2012-12-01
    • 2019-12-07
    • 2019-11-23
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多