Get to know MDN better
Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.
Las nuevas características de ECMAScript 6 no solo están asociadas a cambios y adiciones de sintaxis o a nuevos objetos nativos, sino también a protocolos. Dichos protocolos puede ser implementados por cualquier objeto en relación a algunas convenciones.Existen dos protocolos: Elprotocolo iterable y elprotocolo iterador.
El protocolo iterable le permite a los objetos en JavaScript definir o personalizar su comportamiento de iteración, como por ejemplo qué valores son iterados dentro de una sentencia for..of. Algunos objetos nativos, como Array o Map, tienen un comportamiento de iteración por defecto, mientras otros objetos (como por ejemplo Object) no.
Para ser iterable, un objeto debe implementar el método @@iterator, lo cual significa que el objeto (o uno de los objetos dentro de su cadena de prototipos) debe tener una propiedad con un identificador Symbol.iterator:
Propiedad[Symbol.iterator]
ValorUna función sin argumentos que retorna un objeto, de acuerdo al protocolo iterador.
Siempre que un objeto necesite ser iterado (como al comienzo de un for..of loop), su método @@iterator es llamado sin argumentos, y el iterador retornado es usado para obtener los valores a ser iterados.
El protocolo iterador define una forma estándar que permite producir una secuencia de valores (sean estos finitos o infinitos).
Un objeto es un iterador cuando este implementa un método next() con la siguiente semántica:
Propiedadnext
ValorUna función sin argumentos que retorna un objeto con dos propiedades:
done (boleano)
value - cualquier valor de JavaScript retornado por el iterador. Puede ser omitido cuando el valor de done es true.
Algunos iteradores son a su vez iterables:
Un String es un ejemplo de un objeto iterable nativo:
Para objetos String su iterador por defecto retorna cada uno de sus caracteres, uno a la vez:
En algunas estructuras nativas del lenguaje como en el caso del operador de propagación spread operator, el mismo protocolo de iteración está presente en su parte interna:
Podemos redefinir el comportamiento de iteración creando nuestro propio @@iterator:
Nótese que al redefinir un @@iterator se puede afectar el comportamiento de construcciones nativas que usan el protocolo de iteración:
String, Array, TypedArray, Map y Set son objetos iterables nativos, ya que en su objeto prototipo existe un método @@iterator.
Podemos crear nuestros propios iterables de la siguiente manera:
Existen varios APIs que aceptan iterables, como en el caso de: Map([iterable]), WeakMap([iterable]), Set([iterable]) y WeakSet([iterable]):
De igual manera Promise.all(iterable), Promise.race(iterable), y Array.from().
Algunas declaraciones y expresiones esperan iterables, por ejemplo el bucle for-of, eloperador de propagación spread operator, la expresión Yield*, y la asignación desestructurada destructuring assignment.
Un método @@iterator iterable que no retorne un objeto iterador no está correctamente definido, por lo tanto al ejecutarlo de esta manera podría resultar en excepciones en tiempo de ejecución y otros errores:
Un objeto iterador es tanto un iterador como un iterable:
| ECMAScript® 2027 Language Specification # sec-iteration |
Para información adicional acerca de generadores generators en ES6, puede visitar la página específica sobre este tema.
This page was last modified on 27 jun 2025 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.