Intodrução

Um loop somente é possível se existir um Array em Javascript. Hoje, vamos discutir sobre como utilizar Arrays e fazer um bom uso do mesmo. Há uma grande discussão sobre como devemos inicializar um Array e como iremos chamá-lo para um uso adequado. Certamente, cada um tem sua opinião, porém há fatos que não podemos negar sobre mal uso. Começaremos com o exemplo abaixo utilizando o new Array().

Douglas Crockford, um grande escritor sobre JS, costuma dizer para nunca usarmos nenhum tipo de construtor com new pois é má prática, a não ser que seja obrigatório como o new Date(). Neste caso eu concordo com ele pois há falhas na linguagem e na forma de utilizá-la. Vamos seguir para um exemplo.

Chamando um array com construtor quebrado

  // Até aqui tudo bem
  const array1 = new Array(10, 20);
  console.log(array1.length) // 2
  console.log(arra1) // [10, 20];

  // Mas, o quê que houve?
  const array2 = new Array(10);
  console.log(array2.length); // 10 ???
  console.log(array2); // [undefined x 10] ???

Cair na armadilha de new Array() é bem comum para novos desenvolvedores Javascript, pois em outras linguagens como o Java, instanciar objetos é somente com new. Neste caso, como podemos ver, um novo Array é chamado indevidamente e ao receber somente um parâmetro ele entende como fosse para especificar o seu tamanho total. Neste link podemos ver que inicializando um novo Array com new Array() nunca é uma boa prática e devemos evitar a qualquer custo.

Como podemos melhorar isto?

  const array1 = [10, 20];
  console.log(array1.length); // 2
  console.log(array1); // [10, 20]

  const array2 = [10];
  console.log(array2.length); // 1
  console.log(array2); // [10]

Sempre utilize a forma dinâmica [] para gerar um novo Array pois é o único jeito de utilizá-lo corretamente sem efeitos colaterais inesperados. Com isto em mente, vamos seguir em frente aos loops!

Loops

for

O for parece complexo mas não é. Esta é a forma mais rápida e simples de lidar com loops, mesmo não sendo tão bonito de escrever. Esta expressão do for vem da linguagem C.

  for( /*expressão inicial*/, /*condicional*/, /*expressão incremental*/ ) {
    // Código
  }

  // Veja abaixo um exeplo práticos
  for (var i = 0; i < 5; i++) {
    console.log(i) // Em ordem: 0, 1, 2, 3, 4
  }

do..while

Para cada loop onde o while seja truthy, o que estiver dentro do bloco do é exutado.

  let i = 0;

  do {
    console.log(i);
    i++;
  } while(i < 5);

while

Este é bem simples, enquanto o que estiver dentro da função while for truthy o bloco em seguida é executado.

  let i = 0;

  while (i < 5) {
    console.log(i); // Em ordem: 0, 1, 2, 3, 4
    i++; // Aumentando o valor em +1 a cada iteração
  }

for..in e for..of

O for..in faz uma iteração nas propriedades do array, já o for..of faz uma iteração nos valores.

  let arr = [3, 5, 7];
  arr.foo = "teste";

  for (let i in arr) {
    console.log(i); // Em ordem: "0", "1", "2", "foo"
  }

  for (let i of arr) {
    console.log(i); // Em ordem: "3", "5", "7"
  }

forEach

Função já integrada na herança de prototype, ao inicializar um Array o mesmo já pode ser usado.

  let array = ['name1', 'name2', 'name3'];

  array.forEach( function (name) {
    typeof name === 'string' ? console.log(name.substring(1)) : console.log('Não é string'); // Em ordem: ['ame1', 'ame2', 'ame3']
  });

Particularmente, este é o meu favorito justamente pela sintaxe muito bonita, apesar de não ser o maior custo/benefício em memório. Afinal, este se mistura muito bem para finalizar loops com chain.

  let arr = [1, 2, 3, 4, 5];

  arr.map( num => num * 2 )
     .filter( num => num % 2 === 0)
     .forEach( num => {
      console.log(num); // Em ordem: 2, 4, 6, 8, 10
    });

Finalizando

É importante notar que nenhum desses loops retorna algum valor por default, ou seja, são somente fuções facilitadoras para manipular Arrays. Futuramente iremos discutir sobre loops puros que geram Arrays novos como o map, reduce, filter e afins. Um abraço!