Introdução
Desde que eu estive na faculdade, eu programei em Java, JavaScript, Pascal, ABAP , PHP, Progress 4GL, C / C ++ e, possivelmente, algumas outras linguagens em que não consigo pensar agora.
Embora todos tenham suas próprias idiossincrasias linguísticas, cada um desses idiomas compartilha muitos dos mesmos conceitos básicos. Tais conceitos incluem procedimentos / funções, IF
declarações, FOR
loops e WHILE
loops.
Um for
laço tradicional
Um for
loop tradicional possui três componentes:
- A inicialização: executada antes da primeira execução do bloco de aparência
- A condição: verifica uma condição sempre que o bloco de loop é executado e sai do loop se falso
- A reflexão tardia: realizada sempre que o bloco de loop é executado
Esses três componentes são separados um do outro por um ;
símbolo. O conteúdo de cada um desses três componentes é opcional, o que significa que o seguinte é o for
loop mais mínimo possível:
for (;;) {
// Do stuff
}
Obviamente, você precisará incluir um if(condition === true) { break; }
ou um local if(condition === true) { return; }
dentro desse for
loop para que ele pare de funcionar.
Normalmente, porém, a inicialização é usada para declarar um índice, a condição é usada para comparar esse índice com um valor mínimo ou máximo, e a reflexão posterior é usada para incrementar o índice:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
Usando um for
loop tradicional para percorrer uma matriz
A maneira tradicional de percorrer uma matriz é esta:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Ou, se você preferir fazer um loop para trás, faça o seguinte:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Existem, no entanto, muitas variações possíveis, como por exemplo esta:
for (var key = 0, value = myArray[key], length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... ou este ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... ou este:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
O que funcionar melhor é em grande parte uma questão de gosto pessoal e do caso de uso específico que você está implementando.
Observe que cada uma dessas variações é suportada por todos os navegadores, incluindo os muito muito antigos!
Um while
laço
Uma alternativa para um for
loop é um while
loop. Para percorrer uma matriz, você pode fazer o seguinte:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Como for
loops tradicionais , os while
loops são suportados até pelos navegadores mais antigos.
Além disso, observe que o loop while pode ser reescrito como um for
loop. Por exemplo, o while
loop acima se comporta exatamente da mesma maneira que este for
loop:
for(var key = 0; value = myArray[key++];){
console.log(value);
}
For...in
e for...of
Em JavaScript, você também pode fazer isso:
for (i in myArray) {
console.log(myArray[i]);
}
Isso deve ser usado com cuidado, no entanto, uma vez que não se comporta da mesma forma que um for
loop tradicional em todos os casos, e existem possíveis efeitos colaterais que precisam ser considerados. Consulte Por que usar "for ... in" com iteração de matriz é uma má idéia? para mais detalhes.
Como alternativa for...in
, agora também existe for...of
. O exemplo a seguir mostra a diferença entre um for...of
loop e um for...in
loop:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Além disso, é necessário considerar que nenhuma versão do Internet Explorer suporta for...of
( Edge 12+ ) e que for...in
requer pelo menos o Internet Explorer 10.
Array.prototype.forEach()
Uma alternativa para for
-loops é Array.prototype.forEach()
, que usa a seguinte sintaxe:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Array.prototype.forEach()
é suportado por todos os navegadores modernos, bem como pelo Internet Explorer 9 e posterior.
Bibliotecas
Finalmente, muitas bibliotecas de utilidades também têm suas próprias foreach
variações. AFAIK, os três mais populares são os seguintes:
jQuery.each()
, em jQuery :
$.each(myArray, function(key, value) {
console.log(value);
});
_.each()
, em Underscore.js :
_.each(myArray, function(value, key, myArray) {
console.log(value);
});
_.forEach()
, no Lodash.js :
_.forEach(myArray, function(value, key) {
console.log(value);
});