Si tengo un Map en JavaScript, por ejemplo
const myMap = new Map() myMap.set(0, 'zero') myMap.set(1, 'one')Entonces, ambos parecen ser válidos para iterar a través de los pares clave-valor (y muchas otras opciones que actualmente no me interesan):
// with .entries() for (const [key, value] of myMap.entries()) { // } // without for (const [key, value] of myMap) { // }¿Hay algún caso extremo en el que no hagan lo mismo?
¿Hay algún caso extremo en el que no hagan lo mismo?
No. El objeto iterador que obtiene de entries es exactamente el mismo que proporciona el propio mapa. De hecho, someMap[Symbol.iterator] (la función llamada cuando le pides a un objeto su iterador) es literalmente la misma función que someMap.entries :
const someMap = new Map(); console.log(someMap[Symbol.iterator] === someMap.entries);En la especificación:
Map.prototype.entriesMap.prototype[@@iterator] ( @@iterator iterator es Symbol.iterator ), que literalmente solo apunta a entriesAmbos hacen exactamente lo mismo por defecto.
Cuando for...of se usa con un valor como for (const item of collection) , entonces se usa el conocido símbolo @@iterator para encontrar cuáles serían los valores.
Para objetos Map , @@iterator iterator devolverá .entries() . Es exactamente como llamar al método porque es :
const map = new Map(); console.log(map[Symbol.iterator] === map.entries);Por lo tanto, ambos bucles harán lo mismo.
Pequeña advertencia : eso es por defecto . Si se anula el símbolo @@iterator , entonces puede haber diferentes resultados:
const myMap = new Map() myMap.set(0, 'zero') myMap.set(1, 'one') myMap[Symbol.iterator] = function* () { const entries = this.entries(); for (const [key, value] of entries) yield [key, value.toUpperCase()]; //transform the value } // with .entries() for (const [key, value] of myMap.entries()) { console.log("with .entries()", key, value) } // without for (const [key, value] of myMap) { console.log("without", key, value) }Sin embargo, eso es excepcionalmente inusual que suceda. Y si es así, es probable que quien haya proporcionado el mapa quiera una lógica de iteración diferente.