Já vi muitas perguntas que sugerem o uso de:
for (var i = 0; i < myArray.length; i++){ /* ... */ }
ao invés de:
for (var i in myArray){ /* ... */ }
para matrizes, devido a iteração inconsistente ( veja aqui ).
No entanto, não consigo encontrar nada que pareça preferir o loop orientado a objetos:
myArray.forEach(function(item, index){ /* ... */ });
O que parece muito mais intuitivo para mim.
Para meu projeto atual, a compatibilidade com o IE8 é importante e estou pensando em usar o polyfill da Mozilla , mas não tenho 100% de certeza de como isso funcionará.
- Há alguma diferença entre o loop for padrão (o primeiro exemplo acima) e a implementação de Array.prototype.forEach por navegadores modernos?
- Há alguma diferença entre as implementações de navegador moderno e a implementação do Mozilla vinculada acima (com especial atenção ao IE8)?
- O desempenho não é um problema, apenas a consistência com que as propriedades são iteradas.
javascript
arrays
for-loop
internet-explorer-8
iterator
Michael Lewis
fonte
fonte
break
sairforEach
. Mas uma grande vantagem é criar um novo escopo com a função. Com o polyfill você não deve ter problemas (pelo menos eu não encontrei nenhum).holes
ondeundefined
deveria estar e outros métodos quebrados, comoslice
ehasOwnProperty
wrt para objetos DOM do tipo arrayl. Meus testes ees5 shim
demonstraram tais métodos de shim em conformidade com a especificação (shim do MDN não testado).for
loop, é para isso quesome
serve.Array.find()
para sair do loop após encontrar uma primeira correspondência.Respostas:
A diferença mais substantiva entre o
for
loop e oforEach
método é que, com o primeiro, você podebreak
sair do loop. Você pode simularcontinue
simplesmente retornando da função passada paraforEach
, mas não há como parar completamente o loop.Além disso, os dois realizam efetivamente a mesma funcionalidade. Outra pequena diferença envolve o escopo do índice (e todas as variáveis que contêm) no loop for, devido ao içamento de variável.
No entanto, acho que
forEach
é muito mais expressivo - representa sua intenção de iterar por meio de cada elemento de um array e fornece uma referência ao elemento, não apenas ao índice. No geral, tudo se resume ao gosto pessoal, mas se você puder usarforEach
, eu recomendo.Existem algumas diferenças mais substanciais entre as duas versões, especificamente em relação ao desempenho. Na verdade, o loop for simples tem um desempenho consideravelmente melhor do que o
forEach
método, conforme demonstrado por este teste jsperf .Se essa performance é ou não necessária para você, cabe a você decidir e, na maioria dos casos, eu preferiria a expressividade à velocidade. Essa diferença de velocidade provavelmente se deve às pequenas diferenças semânticas entre o loop básico e o método ao operar em matrizes esparsas, conforme observado nesta resposta .
Se você não precisa do comportamento
forEach
e / ou precisa sair do loop antes, pode usar o Lo-Dash_.each
como alternativa, que também funcionará em vários navegadores. Se você estiver usando jQuery, ele também fornece um similar$.each
, apenas observe as diferenças nos argumentos passados para a função de retorno de chamada em cada variação.(Quanto ao
forEach
polyfill, ele deve funcionar em navegadores mais antigos sem problemas, se você optar por seguir esse caminho.)fonte
each
não se comportam da mesma maneira que a especificação ECMA5 deforEach
, elas tendem a tratar todos os arrays como densos (para evitar bugs do IE, desde que você saiba). Caso contrário, pode ser um "pegadinho". Como referência github.com/es-shims/es5-shim/issues/190Array.prototype.some
que fará um loop até que você retorne um valor verdadeiro ou até que tenha feito um loop completo através do array.Array.prototype.every
é semelhante a,Array.prototype.some
mas para se você retornar um valor falso.Array.prototype.forEach
por alguma versão não compatível teria o potencial de quebrar tantas bibliotecas que evitá-lo por esse motivo não ajudaria de qualquer maneira.Você pode usar sua função foreach personalizada, que terá um desempenho muito melhor do que Array.forEach
Você deve adicionar isso uma vez ao seu código. Isso adicionará uma nova função ao Array.
Depois, você pode usá-lo em qualquer lugar, como Array.forEach
A única diferença é 3 vezes mais rápido. https://jsperf.com/native-arr-foreach-vs-custom-foreach
ATUALIZAÇÃO: Na nova versão do Chrome, o desempenho de .forEach () foi melhorado. No entanto, a solução pode fornecer desempenho adicional em outros navegadores.
fonte
É sugerido por muitos desenvolvedores (por exemplo, Kyle Simpson) para usar
.forEach
para indicar que o array terá um efeito colateral e.map
para funções puras.for
os loops se encaixam bem como uma solução de propósito geral para um número conhecido de loops ou qualquer outro caso que não se encaixe, pois é mais fácil de se comunicar por causa de seu amplo suporte na maioria das linguagens de programação.por exemplo
Em termos de convenção, isso parece melhor, no entanto, a comunidade ainda não estabeleceu uma convenção sobre os
for in
loops de protocolo de iteração mais recentes . Geralmente, acho uma boa ideia seguir os conceitos de FP que a comunidade JS parece estar aberta a adotar.fonte