Qual é o padrão atual em 2017 em Javascript com for () loops versus um .forEach.
Eu estou trabalhando atualmente o meu caminho através Colt Steeles "Web Dev Bootcamp" na Udemy e ele favorece forEach
mais for
em seus ensinamentos. No entanto, procurei várias coisas durante os exercícios como parte do trabalho do curso e encontro cada vez mais recomendações para usar um for
-loop em vez de forEach
. A maioria das pessoas parece afirmar que o loop for é mais eficiente.
É algo que mudou desde que o curso foi escrito (por volta de 2015) ou são realmente os prós e contras de cada um, que se aprenderá com mais experiência.
Qualquer conselho seria muito apreciado.
javascript
loops
for-loop
foreach
tonyrobbins
fonte
fonte
for
é difícil de vencer por pura velocidade.forEach()
invoca um callback para cada iteração; então, isso obviamente carrega consigo alguma sobrecarga.map
apenas para iteração e descarta o novo array que gera. Não sei quantas pessoas tive que corrigir nessa escolha de função específica somente neste site.Respostas:
para
for
os loops são muito mais eficientes. É uma construção de loop projetada especificamente para iterar enquanto uma condição for verdadeira , ao mesmo tempo que oferece um mecanismo de revisão (geralmente para aumentar o iterador). Exemplo:Isso não quer dizer que o for -loops será sempre mais eficiente, apenas que os mecanismos e navegadores JS os otimizaram para ser assim. Ao longo dos anos, houve compromissos quanto a qual construção de loop é mais eficiente (para, enquanto, reduz, inverte enquanto, etc) - diferentes navegadores e mecanismos JS têm suas próprias implementações que oferecem diferentes metodologias para produzir os mesmos resultados. À medida que os navegadores otimizam ainda mais para atender às demandas de desempenho, teoricamente
[].forEach
poderiam ser implementados de forma mais rápida ou comparável a umfor
.Benefícios:
break
econtinue
)i<n
pode ser qualquer coisa e não limitado ao tamanho de uma matriz)var i
deixai
disponível após o término do loop)para cada
.forEach
são métodos que iteram principalmente em arrays (também em outros enumeráveis, como objetosMap
eSet
). Eles são mais novos e fornecem um código subjetivamente mais fácil de ler. Exemplo:Benefícios:
No exemplo acima,
val
seria um parâmetro da função recém-criada. Portanto, quaisquer variáveis chamadasval
antes do loop manteriam seus valores após seu término.atuação
Desempenho é um tópico complicado, que geralmente requer alguma experiência quando se trata de premeditação ou abordagem. Para determinar com antecedência (durante o desenvolvimento) quanta otimização pode ser necessária, um programador deve ter uma boa ideia da experiência anterior com a pasta de problemas, bem como um bom entendimento das soluções potenciais.
Usar o jQuery em alguns casos pode ser muito lento às vezes (um desenvolvedor experiente pode saber disso), enquanto outras vezes pode não ser um problema, caso em que a compatibilidade do navegador cruzado da biblioteca e a facilidade de executar outras funções (por exemplo, AJAX, tratamento de eventos) valeria a pena o tempo de desenvolvimento (e manutenção) economizado.
Outro exemplo é, se desempenho e otimização fossem tudo, não haveria outro código além de máquina ou montagem. Obviamente esse não é o caso, pois há muitas linguagens de alto e baixo nível diferentes, cada uma com suas próprias compensações. Essas compensações incluem, mas não estão limitadas a especialização, facilidade e velocidade de desenvolvimento, facilidade e velocidade de manutenção, código otimizado, código livre de erros, etc.
Abordagem
Se você não tem um bom entendimento se algo exigirá código otimizado, geralmente é uma boa regra escrever código sustentável primeiro. A partir daí, você pode testar e identificar o que precisa de mais atenção quando necessário.
Dito isso, certas otimizações óbvias devem fazer parte da prática geral e não exigir qualquer reflexão. Por exemplo, considere o seguinte loop:
Para cada iteração do loop, JavaScript está recuperando as
arr.length
operações de custo de pesquisa de chave em cada ciclo. Não há razão para que não seja:Isso faz a mesma coisa, mas recupera apenas
arr.length
uma vez, armazenando a variável em cache e otimizando seu código.fonte
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Acredito que com alet
instrução para declarar uma variável local de escopo de bloco, o segundo benefício deforEach
não é mais uma vantagem sobre ofor
loop, a menos que em um ambiente sem suporte paralet
.