Sé lo que es el for... in
bucle (itera sobre la clave), pero escuché la primera vez sobre for... of
(itera sobre el valor).
Estoy confundido con for... of
loop. No recibí adjetivo. Este es el código a continuación:
var arr = [3, 5, 7];
arr.foo = "hello";
for (var i in arr) {
console.log(i); // logs "0", "1", "2", "foo"
}
for (var i of arr) {
console.log(i); // logs "3", "5", "7"
// it is does not log "3", "5", "7", "hello"
}
Lo que obtuve es, for... of
itera sobre los valores de propiedad. Entonces, ¿por qué no registra (regresa) en "3", "5", "7", "hello"
lugar de "3", "5", "7"
? pero el for... in
ciclo itera sobre cada tecla ( "0", "1", "2", "foo"
). Aquí el for... in
ciclo también itera sobre la foo
clave. Pero for... of
no itera sobre el valor de la foo
propiedad, es decir "hello"
. ¿Por qué es así?
Larga historia en resumen:
Aquí tengo un for... of
bucle de consola . Debe iniciar sesión "3", "5", "7","hello"
pero aquí se registra "3", "5", "7"
. Por qué ?
javascript
arrays
object
Mukund Kumar
fuente
fuente
for ... of
se introdujo en el idioma para solucionar los problemas de usofor ... in
con matrices.Array.prototype
podría modificarse de tal manera que haya propiedades adicionales disponibles, lo que hace que no sea seguro iterarlas, ya que podría obtener claves no numéricas que no esperaba.of
(para ... de bucles) , ya que pregunta sobre un comportamiento específico de la función, en lugar de pedir una descripción general.for <key> in
for <value> of
for..of
Respuestas:
for in
recorre los nombres de propiedad enumerables de un objeto.for of
(nuevo en ES6) usa un iterador específico de objeto y recorre los valores generados por eso.En su ejemplo, el iterador de matriz produce todos los valores en la matriz (ignorando las propiedades que no son de índice).
fuente
for ... of
está estandarizado en ES6.for... of
:: arrays :: los arrays siempre tienen una longitud, por lo que puede pensarfor..
[elemento n]of..
[elementos q]for..in..keys
=== claves foráneas === usofor...in
para claves! Como tal, usefor...of
para los valores.Encuentro una respuesta completa en: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (aunque es para script tipo, esto es lo mismo para javascript también)
fuente
index
. Y luego para "de" sería elvalues
de cada índice / clave / elemento.let thisItem = items[all];
variable, ¡for...of
ayuda a atajar eso!for...in
comoObject.keys()
, ¿adivina qué? Las matrices son objetos, algo que también devolvería sus indeces. :)Para ... en bucle
El bucle for ... in mejora las debilidades del bucle for al eliminar la lógica de conteo y la condición de salida.
Ejemplo:
Pero, aún tiene que lidiar con el problema de usar un índice para acceder a los valores de la matriz, y eso apesta; casi lo hace más confuso que antes.
Además, el bucle for ... in puede meterlo en grandes problemas cuando necesita agregar un método adicional a una matriz (u otro objeto). Debido a que ... en bucles recorren todas las propiedades enumerables, esto significa que si agrega propiedades adicionales al prototipo de la matriz, esas propiedades también aparecerán en el bucle.
Huellas dactilares:
Esta es la razón por la cual se desaconseja ... en bucles cuando se repite en matrices.
Para ... de bucle
El for ... of loop se usa para recorrer cualquier tipo de datos que sea iterable.
Ejemplo:
Huellas dactilares:
Esto hace que for ... of loop sea la versión más concisa de todos los bucles for.
¡Pero espera hay mas! El bucle for ... of también tiene algunos beneficios adicionales que solucionan las debilidades del for y for ... en los bucles.
Puede detener o romper un bucle for ... en cualquier momento.
Huellas dactilares:
Y no tiene que preocuparse por agregar nuevas propiedades a los objetos. El for ... of loop solo recorrerá los valores del objeto.
fuente
for (var index=0; index<arr.length; index++)
bucle (donde elindex
contador es un entero, a diferencia de su ejemplo).Diferencia
for..in
yfor..of
:Tanto
for..in
yfor..of
están bucle constructos que se utilizan para iterar sobre estructuras de datos. La única diferencia es sobre lo que iteran:for..in
itera sobre todas las claves de propiedad enumerables de un objetofor..of
itera sobre el valores de un objeto iterable. Ejemplos de objetos iterables son matrices, cadenas y listas de nodos.Ejemplo:
En este ejemplo, podemos observar que el
for..in
bucle itera sobre las teclas del objeto, que es un objeto de matriz en este ejemplo. Las claves son 0, 1, 2 que corresponden a los elementos de la matriz que agregamos yaddedProp
. Así es como searr
ve el objeto de matriz en devtools de Chrome:Ves que nuestro
for..in
bucle no hace más que simplemente iterar sobre estos valores.El
for..of
bucle en nuestro ejemplo itera sobre los valores de una estructura de datos. Los valores en este ejemplo específico son'el1', 'el2', 'el3'
. Los valores que devolverá una estructura de datos iterablefor..of
dependen del tipo de objeto iterable. Por ejemplo, una matriz devolverá los valores de todos los elementos de la matriz, mientras que una cadena devuelve cada carácter individual de la cadena.fuente
La
for...in
declaración itera sobre las propiedades enumerables de un objeto, en un orden arbitrario. Las propiedades enumerables son aquellas propiedades cuyo indicador interno [[Enumerable]] se establece en verdadero, por lo tanto, si hay alguna propiedad enumerable en la cadena del prototipo, elfor...in
ciclo también se repetirá en ellas.La
for...of
declaración itera sobre los datos que el objeto iterable define para iterar.Ejemplo:
Al igual que antes, se puede omitir la adición
hasOwnProperty
defor...of
bucles.fuente
La instrucción for-in itera sobre las propiedades enumerables de un objeto, en orden arbitrario.
El ciclo iterará sobre todas las propiedades enumerables del objeto mismo y aquellas que el objeto hereda del prototipo de su constructor.
Puedes considerarlo "for in" básicamente itera y enumera todas las claves.
fuente
for in
solo mostrará las claves si las agregamos, no mostrará formatoUnicornioString.prototype
.Hay algunos tipos de datos ya definidos que nos permiten iterar sobre ellos fácilmente, por ejemplo, Array, Map, String Objects
Normal for in itera sobre el iterador y en respuesta nos proporciona las claves que están en el orden de inserción como se muestra en el siguiente ejemplo.
Ahora, si intentamos lo mismo con for of , en respuesta nos proporciona los valores, no las claves. p.ej
Entonces, mirando ambos iteradores, podemos diferenciar fácilmente la diferencia entre ambos.
Entonces, si tratamos de iterar sobre un objeto normal, entonces nos dará un error, por ejemplo:
Ahora, para iterar, necesitamos definir un ES6 Symbol.iterator ej.
Esta es la diferencia entre For in y For of . Espero que pueda aclarar la diferencia.
fuente
Otra diferencia entre los dos bucles, que nadie ha mencionado antes:
Fuente
Entonces, si queremos usar la desestructuración en un bucle, para obtener tanto el índice como el valor de cada elemento de la matriz , debemos usar el
for...of
bucle con el método Arrayentries()
:fuente
for each...in
está en desuso (primer punto), pero no escribí sobre eso ... Escribí que "La desestructuraciónfor...in
está en desuso. Use en sufor...of
lugar". (segundo punto): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ¿Está de acuerdo conmigo @GalMargalit?Todos explicaron por qué ocurre este problema, pero aún así es muy fácil olvidarlo y luego rascarse la cabeza por qué obtuviste resultados incorrectos. Especialmente cuando trabajas en grandes conjuntos de datos cuando los resultados parecen estar bien a primera vista.
Utilizándote
Object.entries
asegúrate de recorrer todas las propiedades:fuente
Veo muchas buenas respuestas, pero decido poner mis 5 centavos solo para tener un buen ejemplo:
Para en bucle
itera sobre todos los accesorios enumerables
Para de bucle
itera sobre todos los valores iterables
fuente
Cuando comencé a aprender el bucle for in y of , también estaba confundido con mi salida, pero con un par de investigaciones y comprensión puedes pensar en el bucle individual de la siguiente manera:
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
El código anterior solo está creando un objeto llamado perfil , lo usaremos para nuestros dos ejemplos , así que no se confunda cuando vea el objeto de perfil en un ejemplo, solo sepa que fue creado.
for ... of loop * puede devolver la propiedad , valor o ambos , echemos un vistazo a cómo. En javaScript, no podemos recorrer los objetos normalmente como lo haríamos en matrices, por lo tanto, hay algunos elementos que podemos usar para acceder a cualquiera de nuestras elecciones desde un objeto.
Object.keys ( object-name-goes-here ) >>> Devuelve las claves o propiedades de un objeto.
Object.values ( object-name-goes-here ) >>> Devuelve los valores de un objeto.
A continuación se muestran ejemplos de su uso, preste atención a Object.entries () :
fuente
El
for-in
buclefor-in
El bucle se utiliza para recorrer las propiedades enumerables de una colección, en un orden arbitrario . Una colección es un objeto de tipo contenedor cuyos elementos pueden estar usando un índice o una clave.for-in
loop extrae todas las propiedades enumerables ( claves ) de una colección de una vez y las repite una por una. Una propiedad enumerable es la propiedad de una colección que puede aparecer enfor-in
bucle.Por defecto, todas las propiedades de una matriz y un objeto aparecen en
for-in
bucle. Sin embargo, podemos usar el método Object.defineProperty para configurar manualmente las propiedades de una colección.En el ejemplo anterior, la propiedad
d
demyObject
y el índice3
demyArray
no aparece en elfor-in
bucle porque están configurados conenumerable: false
.Hay pocos problemas con los
for-in
bucles. En el caso de matrices,for-in
loop también considerarámethods
agregado en la matriz usando lamyArray.someMethod = f
sintaxis, sin embargo,myArray.length
permanece4
.los
for-of
bucleEs una idea errónea que el
for-of
ciclo itera sobre los valores de una colección.for-of
el ciclo itera sobre unIterable
objeto. Un iterable es un objeto que tiene el método con el nombreSymbol.iterator
directamente en uno de sus prototipos.Symbol.iterator
El método debe devolver un iterador . Un iterador es un objeto que tiene unnext
método. Este método cuando se llama returnvalue
ydone
propiedades.Cuando iteramos un objeto iterable usando un
for-of
bucle,Symbol.iterator
se llamará al método una vez que obtengamos un objeto iterador . Para cada iteración delfor-of
bucle,next
se llamará al método de este objeto iterador hasta quedone
lanext()
llamada devuelva falso. El valor recibido por elfor-of
ciclo para cada iteración si lavalue
propiedad devuelve lanext()
llamada.El
for-of
ciclo es nuevo en ES6 y también lo son Iterable e Iterables . ElArray
tipo de constructor tieneSymbol.iterator
método en su prototipo. ElObject
constructor lamentablemente no lo tieneObject.keys()
,Object.values()
y losObject.entries()
métodos devuelven un iterable ( puede usarconsole.dir(obj)
para verificar los métodos prototipo ). El beneficio delfor-of
bucle es que cualquier objeto puede hacerse iterable, incluso sus clasesDog
y su costumbreAnimal
.La manera fácil de hacer que un objeto sea iterable es implementar ES6 Generator en lugar de la implementación personalizada del iterador.
A diferencia
for-in
, elfor-of
bucle puede esperar a que se complete una tarea asíncrona en cada iteración. Esto se logra usando laawait
palabra clave después de la documentación de lafor
declaración .Otra gran cosa sobre
for-of
loop es que tiene soporte Unicode. Según las especificaciones de ES6, las cadenas se almacenan con codificación UTF-16. Por lo tanto, cada personaje puede tomar uno16-bit
o32-bit
. Tradicionalmente, las cadenas se almacenaban con codificación UCS-2 que tiene soporte para caracteres que solo se pueden almacenar dentro16 bits
.Por lo tanto,
String.length
devuelve el número de16-bit
bloques en una cadena. Los personajes modernos como un personaje Emoji toman 32 bits. Por lo tanto, este carácter devolveríalength
2. elfor-in
ciclo itera sobre los16-bit
bloques y devuelve el errorindex
. Sin embargo, elfor-of
ciclo itera sobre el carácter individual basado en las especificaciones UTF-16.fuente
Encontré la siguiente explicación de https://javascript.info/array muy útil:
Una de las formas más antiguas de ciclo de los elementos de la matriz es el ciclo for over over indexes:
Técnicamente, debido a que las matrices son objetos, también es posible usar para..in:
El ciclo for..in itera sobre todas las propiedades, no solo las numéricas.
Existen los llamados objetos "tipo matriz" en el navegador y en otros entornos, que parecen matrices. Es decir, tienen propiedades de longitud e índices, pero también pueden tener otras propiedades y métodos no numéricos, que generalmente no necesitamos. Sin embargo, el bucle for..in los enumerará. Entonces, si necesitamos trabajar con objetos tipo matriz, entonces estas propiedades "adicionales" pueden convertirse en un problema.
El bucle for..in está optimizado para objetos genéricos, no para matrices, y por lo tanto es 10-100 veces más lento. Por supuesto, sigue siendo muy rápido. La aceleración solo puede importar en cuellos de botella. Pero aún así debemos ser conscientes de la diferencia.
En general, no deberíamos usar for..in para matrices.
fuente
Aquí hay un mnemónico útil para recordar la diferencia entre
for...in
Loop yfor...of
Loop."indexar, objeto de"
for...in Loop
=> itera sobre el índice en la matriz.for...of Loop
=> itera sobre el objeto de los objetos.fuente