| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Iteration_protocols#iterator | [Back] [Original] |
Get to know MDN better
Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.
Las nuevas caractersticas de ECMAScript 6 no solo estn asociadas a cambios y adiciones de sintaxis o a nuevos objetos nativos, sino tambin a protocolos. Dichos protocolos puede ser implementados por cualquier objeto en relacin 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 iteracin, como por ejemplo qu valores son iterados dentro de una sentencia for..of. Algunos objetos nativos, como Array o Map, tienen un comportamiento de iteracin por defecto, mientras otros objetos (como por ejemplo Object) no.
Para ser iterable, un objeto debe implementar el mtodo @@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:
[Symbol.iterator]
Una funcin 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 mtodo @@iterator es llamado sin argumentos, y el iterador retornado es usado para obtener los valores a ser iterados.
El protocolo iterador define una forma estndar que permite producir una secuencia de valores (sean estos finitos o infinitos).
Un objeto es un iterador cuando este implementa un mtodo next() con la siguiente semntica:
next
Una funcin sin argumentos que retorna un objeto con dos propiedades:
done (boleano)
true si el iterador est ms all del final de la secuencia iterada. En este caso value opcionalmente especifica el valor retornado por el iterador. Los valores retornados son explicados aqu.false si el iterador pudo producir el siguiente valor en la secuencia. Esto es equivalente a no especificar la propiedad done en su totalidad.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:
var someArray = [1, 5, 7];
var someArrayEntries = someArray.entries();
someArrayEntries.toString(); // "[object Array Iterator]"
someArrayEntries === someArrayEntries[Symbol.iterator](); // true
Un String es un ejemplo de un objeto iterable nativo:
var someString = "hi";
typeof someString[Symbol.iterator]; // "function"
Para objetos String su iterador por defecto retorna cada uno de sus caracteres, uno a la vez:
var iterator = someString[Symbol.iterator]();
iterator + ""; // "[object String Iterator]"
iterator.next(); // { value: "h", done: false }
iterator.next(); // { value: "i", done: false }
iterator.next(); // { value: undefined, done: true }
En algunas estructuras nativas del lenguaje como en el caso del operador de propagacin spread operator, el mismo protocolo de iteracin est presente en su parte interna:
[...someString]; // ["h", "i"]
Podemos redefinir el comportamiento de iteracin creando nuestro propio @@iterator:
// es necesario el uso de un objeto creado a partir de la funcin constructora String,
// ya que al usar un string primitivo el auto-boxing generara una referencia temporal
// a un iterador que luego es descartado en el unbox
var someString = new String("hi");
someString[Symbol.iterator] = function () {
return {
// este es el objeto iterador que retorna un nico elemento, la cadena string "bye"
next: function () {
if (this._first) {
this._first = false;
return { value: "bye", done: false };
} else {
return { done: true };
}
},
_first: true,
};
};
Ntese que al redefinir un @@iterator se puede afectar el comportamiento de construcciones nativas que usan el protocolo de iteracin:
[...someString]; // ["bye"]
someString + ""; // "hi"
String, Array, TypedArray, Map y Set son objetos iterables nativos, ya que en su objeto prototipo existe un mtodo @@iterator.
Podemos crear nuestros propios iterables de la siguiente manera:
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterable]; // [1, 2, 3]
Existen varios APIs que aceptan iterables, como en el caso de: Map([iterable]), WeakMap([iterable]), Set([iterable]) y WeakSet([iterable]):
var myObj = {};
new Map([
[1, "a"],
[2, "b"],
[3, "c"],
]).get(2); // "b"
new WeakMap([
[{}, "a"],
[myObj, "b"],
[{}, "c"],
]).get(myObj); // "b"
new Set([1, 2, 3]).has(3); // true
new Set("123").has("2"); // true
new WeakSet(
(function* () {
yield {};
yield myObj;
yield {};
})(),
).has(myObj); // true
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 propagacin spread operator, la expresin Yield*, y la asignacin desestructurada destructuring assignment.
for (let value of ["a", "b", "c"]) {
console.log(value);
}
// "a"
// "b"
// "c"
[..."abc"]; // ["a", "b", "c"]
function* gen() {
yield* ["a", "b", "c"];
}
gen().next(); // { value:"a", done:false }
[a, b, c] = new Set(["a", "b", "c"]);
a; // "a"
Un mtodo @@iterator iterable que no retorne un objeto iterador no est correctamente definido, por lo tanto al ejecutarlo de esta manera podra resultar en excepciones en tiempo de ejecucin y otros errores:
var nonWellFormedIterable = {}
nonWellFormedIterable[Symbol.iterator] = () => 1
[...nonWellFormedIterable] // TypeError: [] is not a function
function makeIterator(array) {
var nextIndex = 0;
return {
next: function () {
return nextIndex < array.length
? { value: array[nextIndex++], done: false }
: { done: true };
},
};
}
var it = makeIterator(["yo", "ya"]);
console.log(it.next().value); // 'yo'
console.log(it.next().value); // 'ya'
console.log(it.next().done); // true
function idMaker() {
var index = 0;
return {
next: function () {
return { value: index++, done: false };
},
};
}
var it = idMaker();
console.log(it.next().value); // '0'
console.log(it.next().value); // '1'
console.log(it.next().value); // '2'
// ...
function* makeSimpleGenerator(array) {
var nextIndex = 0;
while (nextIndex < array.length) {
yield array[nextIndex++];
}
}
var gen = makeSimpleGenerator(["yo", "ya"]);
console.log(gen.next().value); // 'yo'
console.log(gen.next().value); // 'ya'
console.log(gen.next().done); // true
function* idMaker() {
var index = 0;
while (true) yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // '0'
console.log(gen.next().value); // '1'
console.log(gen.next().value); // '2'
// ...
Un objeto iterador es tanto un iterador como un iterable:
var aGeneratorObject = (function* () {
yield 1;
yield 2;
yield 3;
})();
typeof aGeneratorObject.next;
// "function", ya que tiene un mtodo next, por lo tanto es un iterador
typeof aGeneratorObject[Symbol.iterator];
// "function", ya que tiene un mtodo @@iterator, por lo tanto es un iterable
aGeneratorObject[Symbol.iterator]() === aGeneratorObject;
// true, ya que su mtodo @@iterator retorna a s mismo (un iterador), por lo tanto es un iterable bien formado
[...aGeneratorObject];
// [1, 2, 3]
| Specification |
|---|
| ECMAScript 2027 LanguageSpecification # sec-iteration |
Para informacin adicional acerca de generadores generators en ES6, puede visitar la pgina especfica sobre este tema.
This page was last modified on 29 may 2026 by MDN contributors.
Your blueprint for a better internet.
Portions of this content are 19982026 by individual mozilla.org contributors. Content available under a Creative Commons license.
| Web Proxy Viewer | New URL | Original Page |