2013-02-18 33 views
29

的ECMAScript 5的array.forEach(callback[, thisArg])是迭代阵列上非常方便,拥有了对语法的许多优势:为什么ECMAScript 5中的对象没有forEach方法?

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

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

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

+1

这个问题更适合参与ES5/ES6讨论的人员。 – alex 2013-02-18 05:11:21

+0

为什么'for-in'需要更换?为什么'Object.forEach'不会成为一个性能杀手?命中主要来自调用回调函数。 – 2013-02-18 05:23:48

回答

62

呃,自己装配很容易。为什么会进一步污染原型?

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

我认为一个很大的原因是,想要避免将内置属性添加到Object的权力。 Object s是Javascript中的所有东西的构建块,但也是该语言中的通用键/值存储。将新属性添加到Object将与您的Javascript程序可能要使用的属性名称相冲突。因此,将内置名称添加到Object时非常谨慎。

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

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

+18

但是'Object.forEach'(不是原型)会很好。 – kirilloid 2014-02-16 03:48:00

+5

它会,我同意:) – 2014-02-16 18:02:51

+1

它不会污染恕我直言。这就是所谓的一致性。其他语言有它,JS是该委员会中最糟糕的一个。 Sim类似的操作和对diff类型的类型进行的转换在逻辑上有所不同,并且具有完全不同的语法。如果你是头部组织的话,你必须吃一个最大的废话,JS会把你搞砸 – DanteTheSmith 2018-01-02 16:13:39

2

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

如果您当前看到对象及其方法,它们仅用于标识对象或区分一个对象。

5
  1. .forEach创建变量只是迭代的目的...创建只是没有的,你自己。
    如果你正在使用shim,那么它们就是闭包中的JS变量,否则它们可能是C++或者浏览器的本地实现。

  2. ES6正在获得for ... of它将遍历通过它的任何内容。

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

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

但这里的问题是,ES5是为了维护最ES3(几个新的关键字,并在经常使用的没有新的关键字)的语法。
大部分附加功能必须是方法调用(通常是原型)。
考虑到自从ES3推出以来JS已经看到了多少用途,数组需要大量的工作。

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

相关问题