Hay objetos iterables y no iterables en JS. Si el objeto contiene la función Symbol.iterator() entonces es iterable. Si el objeto no contiene esta función, entonces no es iterable. ¿Por qué? Esta función devuelve el objeto iterador.
El conocido símbolo Symbol.iterator especifica el iterador predeterminado para un objeto. Utilizado por para... de.
Está bien. Pero hay otras funciones: keys() , values() , entries() . Estas funciones también devuelven iterador. ¿Cuál es la diferencia entre estos métodos y la función Symbol.iterator() ?
Resulta que ambos métodos están en prototipo.
Entonces, ¿cuál es la diferencia entre keys() , values() , entries() y Symbol.iterator() ? Parece que ambos devuelven objetos iteradores.
Las propiedades como entries , las keys y los values están ahí para su comodidad. Permiten una fácil iteración sobre el contenido de la instancia del Mapa. Tenga en cuenta también en la imagen que publicó que entries también son el valor de la propiedad Symbol.iterator .
La propiedad Symbol.iterator está presente para que código como
for (entry of someMap)se comportará igual que
for (entry of someMap.entries()) Los .keys() y .values() permiten iterar sobre una parte de la instancia del Mapa u otra, en situaciones en las que solo se preocupan por las claves, o solo por los valores. Claramente .entries() también permitiría eso, a través de la asignación de deconstrucción o la indexación de matriz simple.
En última instancia, a menudo no hay respuestas fundamentales satisfactorias a preguntas como "¿por qué el lenguaje x hace esto?" o "¿por qué API x hace esto?" porque son cosas diseñadas por personas que tenían sus propias razones.