¿Por qué no hay ningún método forEach en el objeto en ECMAScript 5?


El array.forEach(callback[, thisArg]) de ECMAScript 5 es muy conveniente para iterar en una matriz y tiene muchas ventajas sobre la sintaxis con un for:

  • Es más conciso.
  • No crea variables que solo necesitamos con el propósito de iterar.
  • Crea un ámbito de visibilidad para las variables locales del bucle.
  • Aumenta el rendimiento.

¿Hay alguna razón por la que no hay object.forEach para reemplazar for(var key in object)?

Por supuesto, podríamos usar un JavaScript implementación, como _.cada uno o $.cada uno menos esos son asesinos de rendimiento.

Author: Samuel Rossille, 2013-02-18

3 answers

Bueno, es bastante fácil de amañar a ti mismo. ¿Por qué contaminar aún más los prototipos?

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

Creo que una gran razón es que los poderes que existen quieren evitar agregar propiedades integradas a Object. Object s son los bloques de construcción de todo en Javascript, pero también son el almacén de clave/valor genérico en el lenguaje. Agregar nuevas propiedades a Object entraría en conflicto con los nombres de propiedades que su programa Javascript podría querer usar. Así que agregar nombres incorporados a Object se hace con extreme precaución.

La matriz está indexada por enteros, por lo que no tiene este problema.

Esta es también la razón por la que tenemos Object.keys(obj) en lugar de simplemente obj.keys. Contaminar el constructor Object ya que normalmente no es un gran problema, pero dejar las instancias en paz.

 69
Author: Alex Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 03:00:30
  1. .forEach hace crear variables solo con el propósito de iteración... Solo que no las creas tú mismo.
    Si está utilizando un shim, entonces son variables JS en un cierre, de lo contrario son probablemente en C++, o lo que sea la implementación nativa del navegador es.

  2. ES6 está obteniendo for ... of que iterará a través de lo que sea que lo pases.

  3. ES6 también obtiene variables a nivel de bloque (en lugar de con ámbito de función), usando let, en lugar de var

  4. Podrá agregar iteradores a tipos específicos de objetos en ES6 (es decir, los objetos que construye para soportar iteradores).

Pero el problema aquí es que ES5 estaba destinado a preservar la mayor parte de la sintaxis de ES3 (pocas palabras clave nuevas, y ninguna nueva palabra clave en uso regular).
La mayor parte de la funcionalidad adicional tenía que ser llamadas a métodos (prototipado, por lo general).
Y los arrays necesitaban mucho trabajo, dado el uso que JS ha visto desde ES3 lanzar.

Los objetos no necesitan .map() / .reduce() habilidad, a menos que estés construyendo objetos MUY ESPECÍFICOS, en cuyo caso, los estás implementando tú mismo.

 6
Author: Norguard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-18 05:28:14

Debe recordar que cada objeto en javascript hereda de Object. No todos los objetos en javascript necesitan tener sus propiedades iteradas. Estos se limitan principalmente a objetos de modelo de datos. Agregar el método forEach solo generará el prototipo de cada objeto innecesariamente.

Si actualmente ve el Objeto y sus métodos, solo están presentes para identificar el objeto, o para distinguir un objeto de otro.

 2
Author: Varun Achar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-18 05:21:27