Eu sei o que é for... in
loop (itera sobre a chave), mas ouvi pela primeira vez sobrefor... of
(itera sobre valor).
Estou confuso com for... of
loop. Não recebi um adjetivo. Este é o código abaixo:
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"
}
O que eu consegui é que for... of
itera sobre os valores da propriedade. Então, por que ele não registra (retorna) em "3", "5", "7", "hello"
vez de "3", "5", "7"
? mas o for... in
loop itera sobre cada tecla ( "0", "1", "2", "foo"
). Aqui, o for... in
loop também itera sobre a foo
chave. Mas for... of
não itera sobre o valor da foo
propriedade, ou seja "hello"
. Por que é assim?
Em resumo:
Aqui eu console o for... of
loop. Ele deve registrar, "3", "5", "7","hello"
mas aqui ele registra "3", "5", "7"
. Por quê ?
javascript
arrays
object
Mukund Kumar
fonte
fonte
for ... of
foi trazido para o idioma para corrigir os problemas de usofor ... in
com Arrays.Array.prototype
pode ser alterado de maneira que propriedades extras estejam disponíveis, tornando inseguro iterá-las, pois você pode obter chaves não numéricas que não esperava.of
chave JavaScript (para ... de loops) , pois pergunta sobre um comportamento específico do recurso, em vez de solicitar uma visão geral.for <key> in
" e "for <value> of
" e perceba que o IE não oferece suportefor..of
Respostas:
for in
faz um loop sobre os nomes de propriedades enumeráveis de um objeto.for of
(novo no ES6) usa um objeto específico iteradore faz um loop sobre os valores gerados por ele.No seu exemplo, o iterador da matriz gera todos os valores da matriz (ignorando propriedades que não são de índice).
fonte
for ... of
é padronizado no ES6.for... of
:: :: matrizes matrizes sempre têm um comprimento, de modo que você pode pensarfor..
[enésimo elemento]of..
[elementos q]for..in..keys
=== chaves estrangeiras === usefor...in
para chaves! Como tal, usefor...of
para valores.Eu encontro uma resposta completa em: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (Embora seja para script de tipo, isso também é para javascript)
fonte
index
. E então para "de" seria ovalues
de cada índice / chave / item.let thisItem = items[all];
variável,for...of
ajuda a atalho!for...in
comoObject.keys()
, adivinhem? Matrizes são objetos, então também retornam seus indeces. :)For ... in loop
O loop for ... in melhora os pontos fracos do loop for, eliminando a lógica de contagem e a condição de saída.
Exemplo:
Mas você ainda precisa lidar com a questão de usar um índice para acessar os valores da matriz, e isso fede; quase o torna mais confuso do que antes.
Além disso, o loop for ... in pode causar grandes problemas quando você precisa adicionar um método extra a uma matriz (ou outro objeto). Como o loop for ... in sobre todas as propriedades enumeráveis, isso significa que, se você adicionar outras propriedades ao protótipo da matriz, essas propriedades também aparecerão no loop.
Impressões:
É por isso que os loops ... in são desencorajados ao fazer um loop sobre matrizes.
For ... de loop
O loop for ... of é usado para fazer um loop sobre qualquer tipo de dados que seja iterável.
Exemplo:
Impressões:
Isso torna o loop for ... of a versão mais concisa de todos os loops for.
Mas espere, tem mais! O loop for ... of também tem alguns benefícios adicionais que corrigem os pontos fracos dos loops for e for ....
Você pode parar ou interromper um loop for ... a qualquer momento.
Impressões:
E você não precisa se preocupar em adicionar novas propriedades aos objetos. O loop for ... of fará loop somente sobre os valores no objeto.
fonte
for (var index=0; index<arr.length; index++)
loop (onde oindex
contador é um número inteiro, diferente do seu exemplo).Diferença
for..in
efor..of
:Ambas
for..in
efor..of
são construções de loop que são usadas para iterar sobre estruturas de dados. A única diferença é sobre o que eles iteram:for..in
itera sobre todas as chaves de propriedade enumeráveis de um objetofor..of
itera sobre os valores de um objeto iterável. Exemplos de objetos iteráveis são matrizes, seqüências de caracteres e NodeLists.Exemplo:
Neste exemplo, podemos observar que o
for..in
loop itera sobre as chaves do objeto, que é um objeto de matriz neste exemplo. As chaves são 0, 1, 2, que correspondem aos elementos da matriz que adicionamos eaddedProp
. É assim que oarr
objeto array fica no chrome devtools:Você vê que nosso
for..in
loop não faz nada além de simplesmente iterar sobre esses valores.O
for..of
loop em nosso exemplo itera sobre os valores de uma estrutura de dados. Os valores neste exemplo específico são'el1', 'el2', 'el3'
. Os valores que uma estrutura de dados iterável retornará usandofor..of
depende do tipo de objeto iterável. Por exemplo, uma matriz retornará os valores de todos os elementos da matriz, enquanto uma string retorna todos os caracteres individuais da string.fonte
A
for...in
instrução itera sobre as propriedades enumeráveis de um objeto, em uma ordem arbitrária. Propriedades enumeráveis são aquelas cujo sinalizador interno [[Enumerable]] está definido como true; portanto, se houver alguma propriedade enumerável na cadeia de protótipos, ofor...in
loop também será iterado.A
for...of
instrução itera sobre os dados que o objeto iterável define para ser iterado.Exemplo:
Como anteriormente, você pode pular a adição
hasOwnProperty
defor...of
loops.fonte
A instrução for-in itera sobre as propriedades enumeráveis de um objeto, em ordem arbitrária.
O loop iterará sobre todas as propriedades enumeráveis do próprio objeto e aquelas que o objeto herda do protótipo do construtor
Você pode pensar nisso como "for in", basicamente itera e lista todas as chaves.
fonte
for in
só irá mostrar as chaves se forem adicionadas por nós, não vai mostrar formatUnicornString.prototype
.Existem alguns tipos de dados já definidos que nos permitem iterá-los facilmente, por exemplo, Array, Map, String Objects
Normal para itera sobre o iterador e, em resposta, fornece as chaves que estão na ordem de inserção, como mostrado no exemplo abaixo.
Agora, se tentarmos o mesmo com for de , em resposta, ele nos fornecerá os valores, não as chaves. por exemplo
Portanto, olhando para os dois iteradores, podemos diferenciar facilmente a diferença entre os dois.
Portanto, se tentarmos iterar sobre o objeto normal, ele nos dará um erro, por exemplo:
Agora, para iterar, precisamos definir um Symbol.iterator do ES6, por exemplo
Essa é a diferença entre For in e For of . Espero que isso possa esclarecer a diferença.
fonte
Outra diferença entre os dois loops, que ninguém mencionou antes:
Fonte
Portanto, se queremos usar a desestruturação em um loop, para obter o índice e o valor de cada elemento do array , devemos usar o
for...of
loop com o método Arrayentries()
:fonte
for each...in
item foi descontinuado (primeiro ponto), mas não escrevi sobre o assunto ... Escrevi que "A reestruturaçãofor...in
está descontinuada. Use emfor...of
vez disso". (segundo ponto): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Você concorda comigo @GalMargalit?Todo mundo explicou por que esse problema ocorre, mas ainda é muito fácil esquecê-lo e depois coçar a cabeça por que você obteve resultados errados. Especialmente quando você está trabalhando em grandes conjuntos de dados, quando os resultados parecem bons à primeira vista.
Usando
Object.entries
você, assegure-se de percorrer todas as propriedades:fonte
A ver muitas boas respostas, mas eu decido colocar meus 5 centavos apenas para ter um bom exemplo:
For in loop
itera sobre todos os adereços enumeráveis
For do laço
itera sobre todos os valores iteráveis
fonte
Quando comecei a aprender o loop for in e of , fiquei confuso com minha saída também, mas com algumas pesquisas e compreensão, você pode pensar no loop individual da seguinte maneira:
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
O código acima está apenas criando um objeto chamado profile ; nós o usaremos nos dois exemplos ; portanto, não se confunda quando vir o objeto de perfil em um exemplo, apenas saiba que ele foi criado.
for ... of loop * pode retornar a propriedade , o valor ou ambos , vamos dar uma olhada em como. No javaScript, não podemos fazer um loop através dos objetos normalmente, como faríamos nas matrizes; portanto, existem alguns elementos que podemos usar para acessar qualquer uma das nossas opções a partir de um objeto.
Object.keys ( nome-do-objeto-vai-para-cá ) >>> Retorna as chaves ou propriedades de um objeto.
Object.values ( nome-do-objeto-vai-aqui ) >>> Retorna os valores de um objeto.
Abaixo estão exemplos de seu uso, preste atenção a Object.entries () :
fonte
O
for-in
laçofor-in
loop é usado para percorrer as propriedades enumeráveis de uma coleção, em uma ordem arbitrária . Uma coleção é um objeto do tipo contêiner cujos itens podem estar usando um índice ou uma chave.for-in
loop extrai as propriedades enumeráveis ( chaves ) de uma coleção de uma só vez e itera sobre ela uma de cada vez. Uma propriedade enumerável é a propriedade de uma coleção que pode aparecer emfor-in
loop.Por padrão, todas as propriedades de uma matriz e um objeto aparecem em
for-in
loop. No entanto, podemos usar o método Object.defineProperty para configurar manualmente as propriedades de uma coleção.No exemplo acima, a propriedade
d
domyObject
e o índice3
demyArray
não aparecem nofor-in
loop porque estão configurados comenumerable: false
.Existem alguns problemas com
for-in
loops. No caso de Arrays, ofor-in
loop também considerarámethods
adicionado à matriz usando amyArray.someMethod = f
sintaxe, no entanto,myArray.length
permanece4
.O
for-of
laçoÉ um equívoco que o
for-of
loop itera sobre os valores de uma coleção.for-of
loop itera sobre umIterable
objeto. Um iterável é um objeto que possui o método com o nomeSymbol.iterator
diretamente em um de seus protótipos.Symbol.iterator
O método deve retornar um iterador . Um iterador é um objeto que possui umnext
método. Este método, quando chamado de retornovalue
edone
propriedades.Quando iteramos um objeto iterável usando
for-of
loop,Symbol.iterator
o método será chamado assim que obter um objeto iterador . Para cada iteração defor-of
loop, onext
método desse objeto iterador será chamado até quedone
retornado pelanext()
chamada retorne false. O valor recebido pelofor-of
loop para cada iteração se avalue
propriedade retornada pelanext()
chamada.O
for-of
loop é novo no ES6 e o Iterable e o Iterables também . OArray
tipo de construtor temSymbol.iterator
método em seu protótipo. OObject
construtor infelizmente não tê-lo, masObject.keys()
,Object.values()
eObject.entries()
métodos retornam um iterável ( você pode usarconsole.dir(obj)
para verificar os métodos de protótipo ). O benefício dofor-of
loop é que qualquer objeto pode ser tornado iterável, mesmo o seu costumeDog
eAnimal
classes.A maneira mais fácil de tornar um objeto iterável é implementando o ES6 Generator em vez da implementação personalizada do iterador.
Ao contrário
for-in
, ofor-of
loop pode esperar a conclusão de uma tarefa assíncrona em cada iteração. Isso é alcançado usando aawait
palavra-chave após a documentação dafor
instrução .Outra grande coisa sobre o
for-of
loop é que ele tem suporte a Unicode. De acordo com as especificações ES6, as strings são armazenadas com a codificação UTF-16. Portanto, cada personagem pode pegar um16-bit
ou32-bit
. Tradicionalmente, as strings eram armazenadas com a codificação UCS-2, que suporta suportes para caracteres que podem ser armazenados16 bits
apenas dentro .Portanto,
String.length
retorna o número de16-bit
blocos em uma sequência. Personagens modernos, como um Emoji, levam 32 bits. Portanto, esse caractere retornarialength
2. ofor-in
loop itera sobre16-bit
blocos e retorna o erradoindex
. No entanto, ofor-of
loop itera sobre o caractere individual com base nas especificações UTF-16.fonte
Achei a seguinte explicação de https://javascript.info/array muito útil:
Uma das maneiras mais antigas de alternar itens da matriz é o loop for over index:
Tecnicamente, como matrizes são objetos, também é possível usar for..in:
O loop for..in itera sobre todas as propriedades, não apenas sobre as numéricas.
Existem objetos chamados "de matriz" no navegador e em outros ambientes que se parecem com matrizes. Ou seja, eles têm propriedades de comprimento e índices, mas também podem ter outras propriedades e métodos não numéricos, dos quais geralmente não precisamos. O loop for..in os listará. Portanto, se precisarmos trabalhar com objetos do tipo matriz, essas propriedades "extras" podem se tornar um problema.
O loop for..in é otimizado para objetos genéricos, não matrizes e, portanto, é 10-100 vezes mais lento. Claro, ainda é muito rápido. A aceleração pode ter apenas gargalos. Mas ainda devemos estar cientes da diferença.
Geralmente, não devemos usar for..in para matrizes.
fonte
Aqui está um mnemônico útil para lembrar a diferença entre
for...in
Loop efor...of
Loop."index in, objeto de"
for...in Loop
=> itera sobre o índice na matriz.for...of Loop
=> itera sobre o objeto dos objetos.fonte