Laços (Loops) - JavaScript
Laços permitem executar uma ação repetidamente, dependendo de certas condições. Em JavaScript, existem os seguintes tipos de laços:
for
for...in
for...of
while
do...while
Laço for
O laço for
for ([inicialização do contador]; [condição]; [incremento do contador]) {
// ações
}
Por exemplo, usamos o laço for
for(let i = 0; i < 5; i++) {
console.log(i);
}
console.log("Fim da execução");
A primeira parte da declaração do laço let i = 0
i
A segunda parte é a condição para a execução do laço: i < 5
i
A terceira parte i++
Portanto, na inicialização, a variável i é 0. Este valor satisfaz a condição i < 5
console.log(i);
Após a execução do bloco de código, a terceira parte da declaração do laço é executada, incrementando o contador. Assim, a variável i
i
0 1 2 3 4 Fim da execução
Cada repetição do laço é chamada de iteração. Assim, neste caso, haverá 5 iterações.
Você pode aumentar o contador de formas diferentes, como decrementando por uma unidade:
for(let i = 10; i > 5; i--) {
console.log(i);
}
Neste caso, os números de 10 a 6 são exibidos no console.
Ou incrementar o contador por 2:
for(let i = 0; i < 10; i += 2) {
console.log(i);
}
Aqui, todos os números pares de 0 a 8 são exibidos no console.
É possível omitir diferentes partes da declaração do laço:
let i = 0;
for(; i < 60;) {
console.log(i);
i = i + 10;
}
Neste caso, a variável i
O contador é útil como índice de elementos de um array, permitindo iterar sobre o array:
const people = ["Tom", "Sam", "Bob"];
for(let i = 0; i < 3; i++) {
console.log(people[i]);
}
Saída no console do navegador:
Tom Sam Bob
Uso de Múltiplos Contadores em um Laço
Quando necessário, você pode usar vários contadores:
for (let i = 1, j = 1; i < 5, j < 4; i++, j++) {
console.log(i + j);
}
// 1ª iteração: i=1, j=1; i + j = 2
// 2ª iteração: i=2, j=2; i + j = 4
// 3ª iteração: i=3, j=3; i + j = 6
Aqui são usados dois contadores e duas condições. Vamos considerar passo a passo o que acontece:
Primeira iteração. Valores iniciais das variáveis
ei
:j
i=1, j=1;
Cada variável tem suas próprias condições. No início, os valores das variáveis atendem a essas condições:
i < 5, j < 4;
No bloco do laço, a soma dessas variáveis é exibida. Em seguida, os valores de ambas as variáveis são incrementados em uma unidade. Eles se tornam:
i=2, j=2;
Esses valores também atendem às condições, portanto, a segunda iteração é executada.
Segunda iteração. Valores das variáveis
ei
:j
i=2, j=2;
Após a execução do bloco do laço, os valores de ambas as variáveis são incrementados em uma unidade. Eles se tornam:
i=3, j=3;
Esses valores também atendem às condições, portanto, a terceira iteração é executada.
Terceira iteração. Valores das variáveis
ei
:j
Após a execução do bloco do laço, os valores de ambas as variáveis são incrementados em uma unidade. Eles se tornam:
i=4, j=4;
O valor da variável
ainda atende à condiçãoi
, mas o valor da variáveli < 5
(4) NÃO atende à condiçãoj
. Portanto, ocorre a saída do laço. O laço é concluído.j < 4
Execução de Ações na Declaração do Laço
Vale destacar que a terceira parte do laço, onde geralmente ocorre a alteração do contador, na realidade representa uma ação arbitrária que é executada após a conclusão do laço. Assim, podemos escrever da seguinte maneira:
for(let i = 0; i < 5; console.log(i++));
console.log("Fim da execução");
Aqui não é definido um bloco de laço, e as próprias ações do laço são definidas na terceira parte do cabeçalho do laço console.log(i++)
A saída no console será:
0 1 2 3 4 Fim da execução
Similarmente, na primeira parte da definição do laço - a inicialização - podemos realizar algumas ações, não necessariamente apenas a declaração do contador:
let i = 0;
for(console.log("Init"); i < 5; i++) {
console.log(i);
}
A definição do contador é colocada fora do laço, e na parte de inicialização do laço, uma string é exibida no console. Saída no navegador:
Init 0 1 2 3 4
Laços Aninhados
Um laço pode conter outro laço dentro de si:
for(let i = 1; i <= 5; i++) {
for(let j = 1; j <= 5; j++) {
console.log(i * j);
}
}
Aqui, um laço está embutido dentro de outro. No laço externo, a variável i
(i <= 5)
No laço interno, a variável-contador j
Depois que o bloco do laço externo é concluído, a variável i
Usando laços aninhados e múltiplos contadores, é possível iterar sobre arrays multidimensionais:
const people = [["Tom", 39], ["Sam", 28], ["Bob", 42]];
for(let i = 0; i < 3; i++) { // iterando sobre o array bidimensional
for(let j = 0; j < 2; j++) { // iterando sobre os arrays aninhados
console.log(people[i][j]);
}
console.log("================="); // para separar os elementos
}
Aqui, o array people
i
people
j
Tom 39 ================= Sam 28 ================= Bob 42 =================
Laço while
O laço while é executado enquanto uma determinada condição for verdadeira. Sua definição formal é:
while(condição) {
// ações
}
Vamos novamente exibir com o while
let i = 1;
while(i <= 5) {
console.log(i);
i++;
}
O laço while
i
do..while
No laço do..while
while
let i = 1;
do {
console.log(i);
i++;
} while(i <= 5)
Aqui, o código do laço será executado 5 vezes, até que i
do
while
Operadores continue e break
Às vezes é necessário sair de um laço antes de sua conclusão. Nesse caso, podemos usar o operador break
for(let i = 1; i <= 6; i++) {
if(i === 4) break;
console.log(i);
}
console.log("Fim da execução");
Este laço incrementa a variável i
if(i === 4) break;
i
break
1 2 3 Fim da execução
Se precisarmos apenas pular uma iteração, mas não sair do laço, podemos usar o operador continue
break
continue
for(let i = 1; i <= 6; i++) {
if(i === 4) continue;
console.log(i);
}
console.log("Fim da execução");
Neste caso, quando o valor da variável i
i === 4
true
if(i === 4) continue;
continue
1 2 3 5 6 Fim da execução
for..in
O laço for..in
for (propriedade in objeto) {
// ações
}
Este laço percorre todas as propriedades de um objeto. Por exemplo:
const person = {name: "Tom", age: 37};
for(prop in person) {
console.log(prop);
}
Aqui, o objeto person
name
age
name age
Obtendo as propriedades e usando a sintaxe especial objeto[propriedade]
const person = {name: "Tom", age: 37};
for(prop in person) {
console.log(prop, person[prop]);
}
Saída no console:
name Tom age 37
for..of
O laço for...of
const text = "Hello";
for(char of text) {
console.log(char);
}
Consequentemente, o laço itera todos os caracteres da string text
char
H e l l o
Outro exemplo pode ser a iteração sobre um array:
const people = ["Tom", "Sam", "Bob"];
for(const person of people) {
console.log(person);
}
Neste caso, o laço itera os elementos do array people. Cada elemento é colocado sequencialmente na constante person
Tom Sam Bob