Sé lo que es el for... inbucle (itera sobre la clave), pero escuché la primera vez sobre for... of(itera sobre el valor).
Estoy confundido con for... ofloop. 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... ofitera sobre los valores de propiedad. Entonces, ¿por qué no registra (regresa) en "3", "5", "7", "hello"lugar de "3", "5", "7"? pero el for... inciclo itera sobre cada tecla ( "0", "1", "2", "foo"). Aquí el for... inciclo también itera sobre la fooclave. Pero for... ofno itera sobre el valor de la foopropiedad, es decir "hello". ¿Por qué es así?
Larga historia en resumen:
Aquí tengo un for... ofbucle 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 ... ofse introdujo en el idioma para solucionar los problemas de usofor ... incon matrices.Array.prototypepodrí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> infor <value> offor..ofRespuestas:
for inrecorre 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 ... ofestá 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...inpara claves! Como tal, usefor...ofpara 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 elvaluesde cada índice / clave / elemento.let thisItem = items[all];variable, ¡for...ofayuda a atajar eso!for...incomoObject.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 elindexcontador es un entero, a diferencia de su ejemplo).Diferencia
for..inyfor..of:Tanto
for..inyfor..ofestán bucle constructos que se utilizan para iterar sobre estructuras de datos. La única diferencia es sobre lo que iteran:for..initera sobre todas las claves de propiedad enumerables de un objetofor..ofitera 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..inbucle 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 searrve el objeto de matriz en devtools de Chrome:Ves que nuestro
for..inbucle no hace más que simplemente iterar sobre estos valores.El
for..ofbucle 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..ofdependen 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...indeclaració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...inciclo también se repetirá en ellas.La
for...ofdeclaración itera sobre los datos que el objeto iterable define para iterar.Ejemplo:
Al igual que antes, se puede omitir la adición
hasOwnPropertydefor...ofbucles.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 insolo 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...ofbucle con el método Arrayentries():fuente
for each...inestá en desuso (primer punto), pero no escribí sobre eso ... Escribí que "La desestructuraciónfor...inestá en desuso. Use en sufor...oflugar". (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.entriesasegú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-inbuclefor-inEl 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-inloop 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-inbucle.Por defecto, todas las propiedades de una matriz y un objeto aparecen en
for-inbucle. Sin embargo, podemos usar el método Object.defineProperty para configurar manualmente las propiedades de una colección.En el ejemplo anterior, la propiedad
ddemyObjecty el índice3demyArrayno aparece en elfor-inbucle porque están configurados conenumerable: false.Hay pocos problemas con los
for-inbucles. En el caso de matrices,for-inloop también considerarámethodsagregado en la matriz usando lamyArray.someMethod = fsintaxis, sin embargo,myArray.lengthpermanece4.los
for-ofbucleEs una idea errónea que el
for-ofciclo itera sobre los valores de una colección.for-ofel ciclo itera sobre unIterableobjeto. Un iterable es un objeto que tiene el método con el nombreSymbol.iteratordirectamente en uno de sus prototipos.Symbol.iteratorEl método debe devolver un iterador . Un iterador es un objeto que tiene unnextmétodo. Este método cuando se llama returnvalueydonepropiedades.Cuando iteramos un objeto iterable usando un
for-ofbucle,Symbol.iteratorse llamará al método una vez que obtengamos un objeto iterador . Para cada iteración delfor-ofbucle,nextse llamará al método de este objeto iterador hasta quedonelanext()llamada devuelva falso. El valor recibido por elfor-ofciclo para cada iteración si lavaluepropiedad devuelve lanext()llamada.El
for-ofciclo es nuevo en ES6 y también lo son Iterable e Iterables . ElArraytipo de constructor tieneSymbol.iteratormétodo en su prototipo. ElObjectconstructor 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-ofbucle es que cualquier objeto puede hacerse iterable, incluso sus clasesDogy 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-ofbucle puede esperar a que se complete una tarea asíncrona en cada iteración. Esto se logra usando laawaitpalabra clave después de la documentación de lafordeclaración .Otra gran cosa sobre
for-ofloop 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-bito32-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.lengthdevuelve el número de16-bitbloques en una cadena. Los personajes modernos como un personaje Emoji toman 32 bits. Por lo tanto, este carácter devolveríalength2. elfor-inciclo itera sobre los16-bitbloques y devuelve el errorindex. Sin embargo, elfor-ofciclo 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...inLoop yfor...ofLoop."indexar, objeto de"
for...in Loop=> itera sobre el índice en la matriz.for...of Loop=> itera sobre el objeto de los objetos.fuente