Laços e vetores em JavaScript

Aprenda a fazer o JavaScript repetir tarefas e lidar com listas de dados. Escreva laços for, while e do...while que executam o número correto de vezes, armazene valores em vetores e adicione, remova, pesquise e altere seus elementos. Processe listas com for...of e com métodos de vetor como map, filter, find e reduce, ordene números e textos na ordem esperada pelos leitores e copie e combine vetores com a sintaxe de espalhamento sem alterar os originais por acidente.

BásicoAula 2 de 9 do curso Curso de Programação em JavaScript

O que você vai aprender

  1. Escreva laços for, while e do...while que executam o número correto de vezes, acompanhe sua execução passo a passo e controle-os com break e continue.
    • Contar e repetir com um laço for
      Escreva um laço for com suas três partes, acompanhe seu contador da primeira à última iteração e calcule uma soma acumulada.
    • Repetir enquanto uma condição for satisfeita
      Use laços while e do...while quando o número de repetições não for conhecido de antemão e garanta que todo laço possa terminar.
    • Interromper laços, pular iterações e aninhar laços
      Saia de um laço antes do fim com break, pule uma iteração com continue e coloque um laço dentro de outro para percorrer grades e pares.
  2. Crie vetores, leia e altere seus elementos por índice, adicione e remova itens e pesquise em vetores ou converta entre vetores e texto.
    • Criar um vetor e ler seus elementos
      Escreva literais de vetor, leia elementos por seus índices a partir de zero e use length e at() para acessar o último elemento.
    • Adicionar, remover e substituir elementos
      Altere vetores no próprio vetor com atribuição por índice, push, pop, shift, unshift e splice, copie partes com slice e distinga métodos que alteram um vetor de métodos que retornam um novo.
    • Pesquisar em um vetor e converter entre vetores e texto
      Verifique se um vetor contém um valor, encontre a posição de um valor, compare vetores corretamente e converta cadeias de caracteres em vetores e vice-versa com split e join.
  3. Visite cada elemento de um vetor com laços for e for...of e use padrões comuns de laços para somar, contar, buscar e construir resultados.
    • Percorrer um vetor com for e for...of
      Escolha entre um laço for baseado em índices e for...of, obtenha o índice quando precisar e evite for...in e a alteração do tamanho de um vetor durante seu percurso.
    • Somar, contar, buscar e construir resultados com padrões de laços
      Aplique os padrões de acumulador, contador, máximo, busca e construção de um novo vetor a listas reais de dados e acompanhe sua execução passo a passo.
  4. Passe funções de seta curtas para métodos de vetor e use forEach, map, filter, find, some, every e reduce para transformar, selecionar, pesquisar e resumir dados.
    • Passar uma função para um método de vetor
      Escreva funções de seta curtas, saiba o que uma função de retorno recebe e deve retornar e use forEach para executar código para cada elemento.
    • Transformar e selecionar elementos com map e filter
      Use map para transformar cada elemento em um novo valor e filter para manter os elementos que passam em um teste, e encadeie os dois.
    • Encontrar elementos e testar condições
      Use find, findIndex, findLast, findLastIndex, some e every para localizar um elemento ou verificar uma condição em uma lista.
    • Combinar todos os elementos em um único valor com reduce
      Use reduce com um acumulador e um valor inicial para calcular somas, contagens e extremos, e acompanhe cada etapa.
  5. Ordene números e textos na ordem correta, incluindo a ordem alfabética do idioma do leitor, e copie e combine vetores com a sintaxe de espalhamento sem alterar os originais por acidente.
    • Ordenar e inverter vetores de números e cadeias de caracteres
      Use sort com uma função de comparação, saiba que sort altera o vetor e use toSorted e toReversed para obter cópias ordenadas ou invertidas.
    • Ordenar e apresentar textos para leitores de qualquer idioma
      Compare cadeias de caracteres com localeCompare e Intl.Collator para obter uma ordem alfabética natural, mantenha datas em um formato ordenável e transforme vetores em texto legível com join, Intl.ListFormat e formatação de números.
    • Copiar e combinar vetores com a sintaxe de espalhamento
      Entenda que variáveis de vetor podem referir-se a um vetor compartilhado e use a sintaxe de espalhamento para copiar, mesclar e inserir vetores e passar elementos de um vetor a uma função como valores separados.

Guia de estudo de Laços e vetores em JavaScript

5 capítulos

1

Repetir código com laços

Repetir código exige um ponto de partida claro, um teste e uma maneira de avançar. Laços de contagem tornam visível o número de passos; laços baseados em condições permitem que os dados decidam quando parar. Acompanhe cada variável que muda para ver o que é executado antes e depois de uma verificação; depois, use saídas antecipadas e laços aninhados para lidar com buscas, valores pulados e pares. Pequenas mudanças em um limite ou em uma atualização podem alterar todo o resultado.

1.1 Controlar um laço de contagem

Um laço repete um bloco de código. Cada execução de seu corpo é uma iteração. Você pode alterar quantas vezes a tarefa se repete mudando o contador e a condição do laço, sem copiar o corpo.

Leia as três partes
for (let i = 1; i <= 5; i++) {
  console.log(i);
}

Os parênteses contêm uma inicialização, uma condição e uma atualização, separadas por ponto e vírgula. let i = 1 é executado uma vez. Em seguida, o JavaScript verifica i <= 5. Se for verdadeiro, o corpo imprime i, a atualização i++ soma 1 e o JavaScript verifica a condição novamente. Uma condição falsa encerra o laço antes de outra execução do corpo.

Valor antes da verificaçãoCondiçãoAção
1trueImprime 1; atualiza para 2
2, 3, 4true a cada vezImprime cada valor e atualiza
5trueImprime 5; atualiza para 6
6falsePara

Há cinco iterações, mas seis verificações da condição. A última verificação, que falha, não executa o corpo. Um laço cuja condição é falsa no início não tem iterações.

Escolha os limites e o passo

for (let i = 0; i < 10; i++) visita de 0 a 9. Começar em 1 com i <= 10 visita de 1 a 10. Ambos executam dez vezes. Para um passo de 1 de a em direção a b, quando b é pelo menos igual a a, < b produz b - a iterações e <= b produz b - a + 1.

A atualização pode dar passos maiores: for (let i = 0; i <= 20; i += 5) visita 0, 5, 10, 15, 20. Contar de trás para frente exige uma atualização decrescente e uma condição correspondente: for (let i = 3; i >= 1; i--) visita 3, 2, 1. Anote o primeiro e o último valor desejados antes de escolher < ou <=; isso ajuda a detectar um erro de uma unidade.

Mantenha uma soma acumulada
let total = 0;
for (let i = 1; i <= 100; i++) {
  total += i;
}
console.log(total); // 5050

total é um acumulador: ele carrega o resultado de uma iteração para a seguinte. Após as três primeiras iterações, contém 1, depois 3, depois 6. Coloque sua declaração antes do laço para que seja inicializado uma vez. Declará-lo dentro do corpo o reiniciaria a cada vez e o tornaria indisponível após o laço.

Diagnostique um laço com comportamento estranho

O contador do cabeçalho usa let porque i++ reatribui seu valor. Um contador com const permite a primeira execução do corpo, mas lança um TypeError na atualização. Um let i declarado no cabeçalho pertence ao laço; lê-lo depois gera um ReferenceError, a menos que outra variável chamada i exista fora dele.

Um ponto e vírgula imediatamente após o cabeçalho dá ao laço um corpo vazio. Em for (let i = 0; i < 3; i++); { console.log("Hello"); }, o bloco executa uma vez após o laço. Mantenha a chave de abertura junto ao cabeçalho. Por fim, verifique a direção da atualização: começar em 0 com i < 5 e i-- afasta o contador do ponto de parada e nunca termina.

Principais conclusões

  • A inicialização executa uma vez; a condição é verificada antes de cada iteração; a atualização ocorre depois do corpo.
  • Verifique o primeiro e o último valor do contador para detectar um erro de uma unidade.
  • Declare uma soma acumulada antes do laço para preservar o trabalho anterior.
  • Use let para um contador que muda e mova-o em direção ao ponto de parada.

1.2 Repetir até uma condição mudar

Algumas tarefas terminam quando um resultado alcança uma meta, não após um número conhecido de passos. Um laço while verifica essa condição de parada antes de cada repetição. Um laço do...while a verifica depois do corpo.

Verifique primeiro com while
let balance = 1000;
let years = 0;
while (balance < 1500) {
  balance = balance * 1.05;
  years++;
}
console.log(years); // 9

O saldo cresce 5% ao ano. Ambas as variáveis são inicializadas antes do laço. Após oito repetições, o saldo é cerca de 1477.46, abaixo da meta, então é necessária mais uma repetição. Após nove, é cerca de 1551.33; a próxima verificação é falsa. Mantenha o saldo completo durante o cálculo e arredonde apenas o resultado exibido.

Se uma condição while for falsa inicialmente, o corpo executa zero vezes. Para um laço simples de contagem, coloque a inicialização antes de while e a atualização no fim do corpo. Isso preserva o comportamento de um laço for quando não há continue. Com continue, a atualização exige cuidado extra porque pode ser pulada.

Execute uma vez antes de verificar
let n = 4096;
let digits = 0;
do {
  n = Math.floor(n / 10);
  digits++;
} while (n > 0);
console.log(digits); // 4

Math.floor arredonda para baixo. Aqui cada divisão remove o último algarismo: 4096 torna-se 409, depois 40, 4 e 0. Cada remoção aumenta digits. Começar com 0 ainda executa uma vez, contando corretamente seu único algarismo. Um while (n > 0) verificado antes do corpo pularia esse caso e informaria zero algarismos. Esse método de contagem de algarismos serve para números inteiros não negativos.

LaçoQuando a condição é verificadaNúmero mínimo de execuções do corpo
whileAntes do corpoZero
do...whileDepois do corpoUma

Com let n = 10, um corpo do...while que imprime n executa uma vez mesmo que sua condição seja n < 5. A mesma condição verificada antes do corpo não imprime nada. O ponto e vírgula vem após a condição final em do...while.

Avance em direção a uma saída

Um laço infinito continua se repetindo sem terminar. Esquecer n++ em let n = 0; while (n < 3) { console.log(n); } deixa a condição verdadeira para sempre. Código que executa por muito tempo pode congelar uma aba do navegador. Acompanhe o que altera a condição e interrompa um script preso usando os controles do navegador.

Uma condição composta como attempts < 3 && !found continua apenas enquanto ambos os testes são verdadeiros. Ela para quando três tentativas foram usadas ou um resultado é encontrado. Para um inteiro não negativo que diminui em direção a zero, while (count > 0) torna uma contagem regressiva mais clara que while (count). Números negativos também são avaliados como verdadeiros, então essa avaliação, por si só, não significa que uma contagem seja positiva.

Evite a igualdade como teste de parada com decimais. Dez adições de 0.1 produzem 0.9999999999999999 em JavaScript, então while (x !== 1) pode ultrapassar o limite desejado e continuar para sempre. Uma comparação como x < 1 permite ultrapassar o limite; um contador inteiro é melhor quando são necessários exatamente dez passos. Calcule cada valor decimal a partir desse contador.

Principais conclusões

  • while pode executar zero vezes; do...while sempre executa pelo menos uma vez.
  • Escolha uma condição com base no que ainda precisa acontecer e altere suas entradas no corpo.
  • Uma condição composta pode interromper o trabalho quando um limite é alcançado ou um resultado é encontrado.
  • O arredondamento em ponto flutuante torna a igualdade decimal exata um teste de parada inadequado.
  • Use contadores inteiros quando o número de repetições precisar ser exato.

1.3 Interromper uma busca, pular tarefas e visitar pares

Um laço pode ser encerrado antes que sua condição se torne falsa ou pular tarefas para apenas um item. Laços aninhados permitem repetir uma sequência dentro de outra, como ao visitar linhas e colunas.

Use break ou continue

break sai de seu laço imediatamente. Para encontrar o primeiro múltiplo de 7 acima de 50:

for (let n = 51; n <= 100; n++) {
  if (n % 7 === 0) {
    console.log(n); // 56
    break;
  }
}

Após imprimir 56, a execução continua depois do laço. Os valores de 57 a 100 nunca são verificados. while (true) pode usar o mesmo padrão quando a saída é mais fácil de testar dentro do corpo; um break alcançável deve fornecer a saída.

continue pula o restante da iteração atual. Em um laço for, ele ainda executa a atualização do cabeçalho antes de verificar a condição novamente:

for (let i = 1; i <= 9; i++) {
  if (i % 2 === 0) continue;
  console.log(i);
}

Os valores pares pulam a impressão, então a saída é 1, 3, 5, 7, 9. Substituir continue por break encerraria o laço em 2, deixando apenas 1 impresso.

Em um laço while, continue salta diretamente para a condição. Uma atualização colocada depois no corpo é pulada. Se i for 2 e o corpo começar com if (i === 2) continue;, esse valor pode ficar preso para sempre. Coloque a atualização necessária antes desse salto ou expresse a contagem com for.

Repita um laço interno para cada linha
for (let row = 1; row <= 3; row++) {
  let line = "";
  for (let col = 1; col <= 4; col++) {
    line = line + (row * col) + " ";
  }
  console.log(line.trim());
}

Para row = 1, o laço interno visita as colunas de 1 a 4 e constrói o texto “1 2 3 4”. Ele recomeça na coluna 1 para a linha 2, produzindo “2 4 6 8”. A linha 3 produz “3 6 9 12”. O corpo interno executa doze vezes: quatro colunas para cada uma das três linhas. Declare line dentro do corpo externo para que cada linha comece com uma cadeia de caracteres vazia.

Use nomes diferentes para os contadores. Um let i interno oculta um i externo, dificultando a leitura das duas posições.

Visite cada par distinto uma vez

Para quatro pessoas numeradas de 0 a 3, inicie o contador interno em i + 1:

for (let i = 0; i < 4; i++) {
  for (let j = i + 1; j < 4; j++) {
    console.log(i, j);
  }
}

Os pares são 0–1, 0–2, 0–3, 1–2, 1–3, 2–3: seis visitas. Começar j em 0 produziria dezesseis visitas, incluindo pares de cada pessoa com ela mesma e pares duplicados em ordem inversa.

Um break comum sai apenas do laço mais interno. Para encerrar uma busca aninhada inteira, rotule o laço externo, por exemplo, outer: for (...), e use break outer; na correspondência. O rótulo identifica o laço do qual sair; ele não altera a ordem em que os pares são testados.

Principais conclusões

  • break encerra um laço; continue pula o restante de uma iteração.
  • continue executa a atualização de um for, mas pode pular uma atualização dentro do corpo de um while.
  • O laço interno recomeça a cada iteração externa.
  • Use j = i + 1 para visitar cada par distinto uma vez.
  • Um break comum sai do laço mais interno.
  • Um break com rótulo também pode sair de um laço externo.
2

Armazenar e alterar listas de dados em vetores

Uma lista tem valores e posições. Vetores mantêm esses valores juntos e dão a cada um um índice numerado. Ler, substituir, inserir e remover elementos depende dessas posições, e as alterações podem mover elementos posteriores para novos índices. Aprenda o que cada método retorna e o que ele altera; depois, escolha buscas e conversões de texto que produzam o formato de resultado necessário para a próxima etapa.

2.1 Ler valores e posições em um vetor

Um vetor armazena uma lista ordenada sob um único nome. Seus valores são chamados de elementos. Um literal de vetor usa colchetes e vírgulas: const temps = [18, 21, 19, 24];. O literal [] cria um vetor vazio.

Conte as posições a partir de zero
const colors = ["red", "green", "blue"];
console.log(colors[0]); // "red"
console.log(colors[2]); // "blue"
console.log(colors.length); // 3

O índice de um elemento é sua posição contada a partir de zero. O terceiro elemento tem índice 2. length conta posições indexadas, incluindo posições vazias. Para esse vetor sem lacunas, também é a contagem de elementos. O último índice é colors.length - 1, então colors[colors.length - 1] lê “blue”.

Ler colors[colors.length] solicita o índice 3, uma posição além do fim, e produz undefined. Um índice ausente não lança um erro apenas por estar ausente. colors[5] também produz undefined.

Leia a partir do fim

colors.at(-1) lê o último elemento e colors.at(-2) lê o anterior. Índices não negativos funcionam como de costume: colors.at(0) lê “red”. Um número negativo entre colchetes tem outro significado: colors[-1] não conta a partir do fim e produz undefined para esse vetor.

ExpressãoResultado
colors[1]"green"
colors.at(-1)"blue"
colors[3]undefined
colors[-1]undefined
Leia uma lista dentro de outra

Um elemento pode ser um vetor:

const grid = [[1, 2, 3], [4, 5, 6]];
console.log(grid[1]); // [4, 5, 6]
console.log(grid[1][0]); // 4

O primeiro índice seleciona uma linha. O segundo seleciona um valor dentro dessa linha. grid.length é 2, enquanto grid[0].length é 3. Esses tamanhos descrevem vetores diferentes. As linhas de um vetor aninhado podem ter tamanhos diferentes.

Vetores podem misturar tipos, como em [42, "km", true]. Uma lista de um tipo de dado, como temperaturas, é mais fácil de processar porque cada elemento pode ser tratado da mesma maneira.

Reconheça um vetor e evite surpresas com posições vazias

typeof [1, 2] retorna “object”, então não é um teste específico para vetores. Use Array.isArray(value): ele retorna true para [1, 2] e false para “12”.

new Array(3) cria três posições vazias; não armazena apenas o número 3. Use [3] para um elemento ou [0, 0, 0] para três zeros explícitos. Uma posição vazia é lida como undefined, mas é uma lacuna, não um valor armazenado explicitamente. Escrever literais de vetor deixa claro o conteúdo desejado.

Leia cadeias de caracteres sem tentar alterá-las no próprio valor

Cadeias de caracteres também permitem usar índices, length e at(). "hello"[1] é “e” e "hello".at(-1) é “o”. Cadeias de caracteres são imutáveis: atribuir um valor a uma posição de caractere não o substitui. Em modo estrito, incluindo módulos JavaScript, essa atribuição lança um TypeError. Construa uma nova cadeia quando o texto precisar mudar.

Principais conclusões

  • Os índices começam em 0; o último índice é length - 1.
  • at(-1) lê o último elemento; arr[-1] não.
  • Leia vetores aninhados um índice por vez.
  • Use Array.isArray para identificar vetores.
  • Literais de vetor distinguem valores armazenados de posições vazias.

2.2 Alterar um vetor ou copiar uma parte dele

Alterar um vetor existente é chamado de mutação. Alguns métodos alteram o vetor; outros retornam um novo vetor. O valor de retorno de um método também pode ser um tamanho ou um elemento removido, então verifique tanto o vetor quanto o resultado da chamada.

Substitua elementos e altere as extremidades
const scores = [70, 80, 90];
scores[1] = 85;
console.log(scores); // [70, 85, 90]

const mantém scores apontando para o mesmo vetor. Ele não congela o conteúdo desse vetor. Atribuir scores = [] lançaria um TypeError, mas a atribuição por índice é permitida.

MétodoAlteraçãoValor de retorno
push(...items)Adiciona ao fimNovo tamanho
pop()Remove do fimElemento removido
unshift(...items)Adiciona ao inícioNovo tamanho
shift()Remove do inícioElemento removido

Para const queue = ["Ana", "Ben"];, queue.push("Cleo") retorna 3. O vetor torna-se ["Ana", "Ben", "Cleo"]. Depois, queue.pop() retorna “Cleo” e deixa os dois primeiros nomes. Armazenar uma chamada de push armazena seu tamanho numérico, não o vetor atualizado. pop e shift retornam undefined em um vetor vazio. Adicionar ou remover no início também desloca os outros índices, o que pode envolver mais trabalho em vetores longos.

Insira e remova no meio

splice(start, deleteCount, ...items) altera o vetor e retorna um vetor dos elementos removidos:

const days = ["Mon", "Tue", "Thu", "Fri"];
const removed = days.splice(2, 0, "Wed");
// days: ["Mon", "Tue", "Wed", "Thu", "Fri"]
// removed: []
const nextRemoved = days.splice(1, 2);
// days: ["Mon", "Thu", "Fri"]
// nextRemoved: ["Tue", "Wed"]

A primeira chamada começa no índice 2, exclui zero itens e insere “Wed” ali. A segunda começa no índice 1 e remove dois itens. Seu segundo argumento é uma quantidade, não um índice final. Elementos após uma inserção ou remoção recebem novos índices.

Copie um trecho com slice

slice(start, end) retorna um novo vetor e exclui o índice final. Para const t = [10, 20, 30, 40, 50];, t.slice(1, 3) produz [20, 30] e deixa t inalterado. t.slice(-2) copia os dois últimos elementos, [40, 50]. Sem argumentos, t.slice() copia o vetor inteiro. A letra extra em splice indica uma operação diferente: ele altera o original; slice copia um trecho.

Mantenha a lista livre de lacunas acidentais

Escrever além do fim cria posições vazias. Após const a = [1, 2]; a[4] = 5;, o tamanho é 5 e os índices 2 e 3 são lacunas. delete a[i] também deixa uma lacuna e preserva o tamanho. Use push para adicionar ao fim e splice(i, 1) para remover um elemento e fechar a lacuna.

Atribuir um length menor remove elementos do fim. a.length = 0 esvazia o vetor. Os elementos removidos não reaparecem se o tamanho for aumentado depois.

sort e reverse também alteram vetores. Os métodos de cópia incluem slice, concat, map, filter, toSorted, toReversed, toSpliced e with. Quando um método retorna um novo vetor, salve ou use esse resultado; o original ainda contém seu conteúdo anterior.

Principais conclusões

  • const impede a reatribuição da variável, mas permite a mutação do vetor.
  • push e unshift retornam tamanhos; pop e shift retornam elementos removidos.
  • splice altera o próprio vetor e retorna os elementos removidos.
  • slice copia um trecho cujo índice final é excluído.
  • delete deixa uma lacuna; splice(i, 1) a fecha.
  • Definir um length menor remove elementos do fim.
  • Guarde o resultado de um método de cópia quando precisar do novo vetor.

2.3 Pesquisar valores e transformar listas em texto

Uma busca pode precisar de um resultado sim/não ou da posição de um elemento. A conversão de texto tem outra finalidade: ela altera o formato dos dados para que uma lista possa ser lida, armazenada ou processada.

Pergunte se está presente ou onde está

includes(value) retorna um booleano. ["tea", "coffee"].includes("tea") é true; mudar a busca para “Tea” produz false. A correspondência de texto diferencia maiúsculas de minúsculas, e os tipos importam: [5].includes("5") é false.

indexOf(value) retorna o primeiro índice correspondente, ou -1 quando nenhum valor corresponde. lastIndexOf pesquisa a partir do fim. Com [3, 7, 3, 9], o primeiro 3 está no índice 0 e o último está no índice 2. Procurar 5 retorna -1.

Não escreva if (arr.indexOf(x)). O índice 0 é avaliado como falso, enquanto -1 é avaliado como verdadeiro: esse teste rejeita uma correspondência no início e aceita um valor ausente. Use arr.indexOf(x) !== -1 ou use includes quando a posição não for necessária.

Para valores comuns, ambos os métodos exigem o mesmo tipo e valor, como na igualdade estrita. O tratamento de NaN difere: [1, NaN].includes(NaN) é true, mas [1, NaN].indexOf(NaN) é -1. A regra de igualdade usada por includes pode considerar NaN igual a si mesmo.

Compare o conteúdo de propósito

Dois vetores criados separadamente são vetores diferentes mesmo quando seus elementos correspondem. [1, 2] === [1, 2] é false; == também compara a identidade dos vetores. Para verificar se têm o mesmo conteúdo ordenado, compare os tamanhos e depois os valores em cada índice correspondente. Uma simples verificação sim/não de pertinência não estabeleceria a mesma ordem ou o mesmo número de repetições.

Una elementos em uma cadeia de caracteres
const dateParts = ["2026", "03", "15"];
console.log(dateParts.join("-")); // "2026-03-15"
console.log([1, 2, 3].join()); // "1,2,3"
console.log([1, 2, 3].join("")); // "123"

join coloca seu separador entre os elementos, nunca depois do último. Seu separador padrão é uma vírgula sem espaços. Elementos null e undefined contribuem com texto vazio. Escolha o separador explicitamente para uma saída legível.

Usar + com uma cadeia de caracteres também converte um vetor em texto, mas usa vírgulas: "List: " + [1, 2] torna-se “List: 1,2”. A estrutura aninhada se perde nesse texto: String([1, [2, 3]]) produz “1,2,3”. Registre o próprio vetor para inspecionar sua estrutura.

Divida o texto em partes

"red,green,blue".split(",") retorna ["red", "green", "blue"]. O separador deve corresponder exatamente. Dividir “red, green” apenas pela vírgula mantém o espaço no início de “ green”; dividir por “, ” remove a vírgula e esse espaço.

"4,8,15".split(",") retorna cadeias de caracteres, não números. Converta cada parte antes de somar valores numéricos. Caso contrário, o operador + pode unir texto em vez de calcular uma soma.

Para texto simples baseado em letras, "stressed".split("").reverse().join("") produz “desserts”. A divisão cria um novo vetor, a inversão altera esse vetor e a junção reconstrói uma cadeia de caracteres. Um separador vazio divide unidades de código UTF-16; alguns símbolos usam mais de uma unidade, então essa não é uma maneira geral de inverter todo texto legível por humanos.

Principais conclusões

  • Use includes para verificar pertinência e indexOf ou lastIndexOf para posições.
  • Compare um índice de busca com -1; não use sua avaliação como verdadeiro ou falso.
  • Vetores separados são comparados pela identidade, mesmo quando seus valores parecem idênticos.
  • join cria texto; split cria um vetor de cadeias de caracteres.
  • Espaços só fazem parte do separador quando você os inclui explicitamente.
  • Converta texto numérico antes de operações aritméticas.
3

Percorrer vetores com laços

Percorrer uma lista fica mais fácil quando o laço expõe as informações certas. Às vezes o corpo precisa apenas de cada valor; outras vezes, precisa de um índice, um valor anterior ou um percurso de trás para frente pelo vetor. Construa padrões reutilizáveis para somas, contagens, buscas e novas listas e observe como cada resultado muda após uma iteração. Esses padrões também explicam os métodos de vetor apresentados a seguir.

3.1 Visitar valores de um vetor sem pulá-los

Um laço pode visitar posições de um vetor ou obter os valores diretamente. Escolha a forma que expõe as informações necessárias ao corpo. Lembre-se de que os índices do vetor mudam ao inserir ou remover elementos.

Use índices para posições e direção
const fruits = ["apple", "pear", "plum"];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}

Os índices são 0, 1, 2. O teste é < fruits.length, pois o índice 3 está além do fim. Com <=, uma iteração extra leria undefined. Laços por índices também podem percorrer de trás para frente, começando em fruits.length - 1 e continuando enquanto i >= 0, ou visitar elementos de dois em dois com i += 2.

Use for...of para valores
for (const fruit of fruits) {
  console.log(fruit.toUpperCase());
}

Isso imprime “APPLE”, “PEAR” e “PLUM”. fruit contém um valor por iteração. const funciona porque cada iteração cria uma nova vinculação; o laço não reatribui um contador compartilhado. for...of também funciona em cadeias de caracteres. Um laço sobre “banana” pode contar vogais testando "aeiou".includes(ch) para cada ch.

Alterar um número local não escreve no vetor. Após for (let n of nums) { n = n * 2; }, os elementos numéricos de nums permanecem inalterados. Para alterá-los, atribua por nums[i] ou construa um novo vetor de números duplicados.

Obtenha valores e índices juntos

entries() fornece pares que contêm um índice e um valor. Os colchetes no cabeçalho do laço extraem cada par:

for (const [i, fruit] of fruits.entries()) {
  console.log((i + 1) + ". " + fruit);
}

A saída é “1. apple”, “2. pear”, “3. plum”. Os índices do vetor ainda começam em zero; i + 1 altera apenas a numeração exibida.

NecessidadeLaço útil
Cada valor em ordemfor...of
Posições, ordem inversa ou vizinhosfor baseado em índices
Valor e índice juntosfor...of sobre entries()

for...in visita nomes de propriedades. Em vetores, seus índices são cadeias de caracteres e ele pode incluir propriedades extras. Use as formas de laço para vetores acima para processar elementos.

Evite pular elementos deslocados
const nums = [2, 4, 5, 6];
for (let i = 0; i < nums.length; i++) {
  if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// nums is [4, 5]

No índice 0, remover 2 desloca 4 para o índice 0. A atualização move i para 1, então 4 é pulado. O laço então encontra 5 e remove 6. O resultado ainda contém um número par.

Ao remover por índice, percorra de trás para frente a partir do fim. Remover um elemento desloca apenas posições já visitadas. Outra abordagem é construir um novo vetor com os valores a manter. Evite adicionar elementos ao mesmo vetor enquanto o teste de parada de um laço depender de seu tamanho; o limite pode continuar mudando.

Principais conclusões

  • Visite os índices a partir de 0 enquanto i < arr.length.
  • Use for...of quando apenas os valores forem necessários.
  • entries() fornece pares de índice e valor.
  • Reatribuir uma variável numérica local do laço não substitui um elemento do vetor.
  • Remover durante o percurso do início ao fim pode pular elementos deslocados; percorra de trás para frente ou construa um novo vetor.

3.2 Construir somas, buscas e novas listas

Muitas tarefas com vetores usam os mesmos pequenos padrões de laços. Decida qual resultado você precisa, escolha seu valor inicial e atualize-o uma vez para cada elemento relevante. Um rastreamento mostra o que o resultado significa após cada etapa.

Acumule uma soma e conte correspondências
const temps = [18, 21, 19, 24];
let sum = 0;
let warm = 0;
for (const t of temps) {
  sum += t;
  if (t > 20) warm++;
}

sum soma cada temperatura; warm adiciona um apenas para uma temperatura acima de 20 °C. Eles acompanham quantidades diferentes. Um rastreamento torna essa distinção visível:

tsum após a adiçãowarm após a verificação
18180
21391
19581
24822

A média é sum / temps.length, produzindo 20,5 °C. Verifique o tamanho antes de dividir: um vetor vazio produz 0 / 0, que é NaN, e não uma média significativa.

Acompanhe o maior ou o menor valor

Para um vetor não vazio, inicialize o máximo com seu primeiro elemento. Depois, substitua-o apenas quando encontrar um valor maior:

const values = [-3, -7, -1, -5];
let max = values[0];
for (const n of values) {
  if (n > max) max = n;
}
// max is -1

Começar em zero manteria incorretamente o zero para uma lista só de valores negativos. Começar em -Infinity também funciona para um máximo, mas uma entrada vazia manteria esse valor inicial. Para um mínimo, inverta a comparação e escolha o primeiro elemento ou Infinity como valor inicial.

Encontre a primeira correspondência ou teste uma lista inteira

Uma busca armazena uma correspondência e sai com break. Com let firstWarm;, o laço pode atribuir firstWarm = t no primeiro t > 20 e interromper a busca. Ele encontra 21, sem verificar os elementos posteriores. Se nada corresponder, a variável permanece undefined.

Para um teste de “todos”, inicie um indicador em true e defina-o como false na primeira falha. Para um teste de “algum”, comece em false e defina-o como true no primeiro sucesso. Com notas de aprovação definidas como pelo menos 50, [72, 85, 49] falha no teste de aprovação de todos em 49. Uma lista vazia deixa o indicador inicial inalterado.

Construa valores alterados e compare vizinhos
const km = [1.5, 3, 0.25];
const meters = [];
for (const d of km) {
  meters.push(d * 1000);
}
// meters is [1500, 3000, 250]

O novo vetor começa vazio e recebe uma distância convertida por iteração. Coloque uma condição antes de push quando apenas alguns valores pertencerem ao resultado.

Para variações de um dia para o outro, comece no índice 1, pois o índice 0 não tem dia anterior:

const changes = [];
for (let i = 1; i < temps.length; i++) {
  changes.push(temps[i] - temps[i - 1]);
}
// changes is [3, -2, 5]

Há uma diferença a menos que o número de medições. Subtrair na ordem oposta inverteria todos os sinais. Os mesmos formatos de resultado aparecem nos métodos de vetor: map constrói valores transformados, filter mantém correspondências, find pesquisa, some e every testam, e reduce acumula. Um laço continua útil quando uma passagem precisa produzir vários resultados, como com sum e warm.

Principais conclusões

  • Inicie somas e contagens em zero e atualize cada uma conforme sua finalidade.
  • Inicialize um extremo com um valor dos dados ou com o infinito adequado.
  • Uma busca pela primeira correspondência para com break.
  • Indicadores de todos e algum começam com valores booleanos opostos.
  • Construa um novo vetor com push para preservar o original.
  • Comece comparações entre vizinhos no índice 1.
  • Acompanhe as variáveis que mudam para encontrar onde um resultado começa a ficar errado.
4

Processar vetores com métodos que recebem funções de retorno

Métodos de vetor permitem que uma função curta descreva o que deve acontecer com cada valor. O método gerencia o percurso enquanto a função de retorno fornece uma transformação, um teste ou o próximo resultado acumulado. Leia o valor retornado com atenção: ele pode ser um vetor, um elemento, um índice, um booleano ou uma soma. As mesmas regras de funções de retorno servem para todas essas tarefas, inclusive para obter um comportamento confiável quando uma lista está vazia.

4.1 Passar uma função de retorno a um método de vetor

Uma função recebe entradas, executa código e pode retornar um resultado. Uma função de retorno é uma função passada a outra para que ela a chame. Métodos de vetor usam funções de retorno para descrever o trabalho para cada elemento.

Escreva uma função de seta curta

n => n * 2 recebe um parâmetro chamado n e retorna seu valor duplicado. A seta separa as entradas do corpo. Um único parâmetro pode dispensar parênteses. Zero ou vários parâmetros precisam deles: () => 0 e (a, b) => a - b.

const double = n => n * 2;
const doubled = [1, 2, 3].map(double);
// doubled is [2, 4, 6]

double nomeia a própria função. O método a chama com cada número. Escrever map(double()) chamaria a função imediatamente e passaria o resultado em vez da função. Com um teste nomeado como function isEven(n) { return n % 2 === 0; }, use filter(isEven) para deixar o método fornecer cada elemento.

Retorne de um corpo em bloco

Uma expressão após a seta é retornada automaticamente. Chaves criam um bloco, então um resultado precisa de um return explícito:

const double = n => {
  const doubled = n * 2;
  return doubled;
};

Sem return, a função retorna undefined. Portanto, [1, 2, 3].map(n => { n * 2; }) produz [undefined, undefined, undefined]. A multiplicação é executada, mas seu valor nunca se torna o resultado da função de retorno.

Leia os argumentos da função de retorno pela posição

Métodos como map, filter e forEach passam primeiro o elemento, depois seu índice a partir de zero e, em terceiro, o vetor inteiro. Em (name, i) => ..., os nomes são sua escolha; suas posições determinam o que recebem. Omita os parâmetros não usados a partir do fim. Outros métodos têm assinaturas diferentes: reduce também recebe um acumulador, e uma função de retorno de ordenação recebe dois valores para comparar.

Use forEach para ações
const letters = ["a", "b"];
const result = letters.forEach((letter, i) => {
  console.log(i + ": " + letter);
});
// Prints "0: a" and "1: b".
// result is undefined.

Imprimir é um efeito colateral: uma ação realizada enquanto a função de retorno executa. forEach descarta os valores de retorno da função e retorna undefined. Use map quando precisar de um novo vetor de resultados. Retornar um valor de uma função de retorno de forEach não muda essa regra.

Um return nessa função de retorno encerra apenas a chamada atual; o método continua para o próximo elemento. break não pode ser usado dentro de uma função de retorno para sair de forEach. Escolha for...of com break ou um método de busca como find ou some quando o trabalho posterior deve parar em uma correspondência.

Esses métodos que recebem funções de retorno não alteram, por si só, o vetor de origem. A função de retorno ainda pode alterá-lo, por exemplo, por atribuição de índice ou push. Manter as funções de retorno focadas no valor retornado ou na ação desejada facilita entender o que o vetor de origem conterá depois.

Principais conclusões

  • Passe a própria função de retorno, sem chamá-la primeiro.
  • Um corpo com expressão retorna seu valor automaticamente; um corpo em bloco precisa de return.
  • As posições dos parâmetros da função de retorno determinam seus significados.
  • forEach realiza ações e retorna undefined.

4.2 Transformar cada valor ou manter valores correspondentes

Escolha um método de vetor pelo formato do resultado. map produz um valor para cada elemento presente. filter mantém os elementos originais que passam em um teste. Ambos retornam novos vetores.

Transforme com map
const km = [1.5, 3, 0.25];
const meters = km.map(d => d * 1000);
// meters is [1500, 3000, 250]; km is unchanged.

O retorno da função torna-se o elemento na posição correspondente. Para uma entrada sem lacunas, há uma chamada da função de retorno por elemento, e o resultado tem o mesmo tamanho. Transformar elementos que são cadeias de caracteres também funciona: ["ana", "ben"].map(s => s.toUpperCase()) produz ["ANA", "BEN"].

O segundo parâmetro da função de retorno fornece o índice. ["Ana", "Ben"].map((name, i) => (i + 1) + ". " + name) constrói ["1. Ana", "2. Ben"]. Se a função de retorno tiver um corpo em bloco, retorne explicitamente o valor a armazenar.

Selecione com filter
const temps = [18, 21, 19, 24];
const warm = temps.filter(t => t > 20);
// warm is [21, 24]

filter mantém um elemento quando a função de retorno produz um resultado avaliado como verdadeiro. Ele mantém o próprio elemento, não o booleano da função de retorno. Os valores mantidos permanecem na ordem original. O resultado pode conter todos os elementos, alguns ou nenhum; temps.filter(t => t > 30) é [].

Não retorne o próprio elemento quando zero for um dado válido. [0, 5, 0, 3].filter(n => n) descarta ambos os zeros porque são avaliados como falsos. Uma condição como n !== null remove medições ausentes representadas por null e preserva o zero. Explicite a regra para manter um elemento.

Resultado necessárioMétodo
Um valor transformado por elementomap
Todos os elementos originais que passam em um testefilter
Alguns elementos, depois transformadosfilter seguido de map

Usar map com uma condição que retorna undefined para elementos rejeitados não os remove. Esses resultados undefined ainda ocupam posições no novo vetor.

Acompanhe uma cadeia da esquerda para a direita

[12, 7, 30, 4].filter(n => n >= 10).map(n => n / 2) cria primeiro [12, 30], depois [6, 15]. A segunda função de retorno recebe apenas os elementos mantidos. Filtrar antes de transformar é adequado quando o teste se refere aos valores originais. Alterar a ordem pode mudar o que o teste recebe.

Converta texto numérico de propósito
const numbers = "4,8,15".split(",").map(Number);
// numbers is [4, 8, 15]

Number recebe cada parte do texto e produz um número. Passar parseInt diretamente é uma armadilha: seu segundo argumento é uma base numérica, enquanto map fornece o índice nessa posição. ["10", "10", "10"].map(parseInt) produz [10, NaN, 2]. Use map(s => parseInt(s, 10)) para fixar a base ou map(Number) para essas cadeias numéricas inteiras.

Nem map nem filter substitui a origem. temps.map(t => t + 1); sozinho descarta o vetor recém-calculado. Salve-o, retorne-o de uma função ou use-o em uma cadeia.

Principais conclusões

  • map retorna valores transformados em um novo vetor do mesmo tamanho.
  • filter retorna os elementos originais correspondentes em sua ordem existente.
  • Um teste de filtro deve expressar a regra desejada para que zeros válidos sejam mantidos.
  • Funções de retorno encadeadas operam sobre o resultado do método anterior.
  • Use Number ou uma função envoltória de um argumento em vez de map(parseInt).
  • Armazene ou use o novo vetor; a origem permanece inalterada.

4.3 Encontrar uma correspondência e verificar algum ou todos

Algumas perguntas precisam de um valor, outras de uma posição ou de uma resposta sim/não. Métodos de busca podem parar assim que essa resposta for conhecida. Escolher o tipo de retorno adequado facilita escrever corretamente as condições posteriores.

Escolha um valor ou um índice
const temps = [18, 21, 19, 24];
console.log(temps.find(t => t > 20)); // 21
console.log(temps.findIndex(t => t > 20)); // 1
console.log(temps.findLast(t => t > 20)); // 24
console.log(temps.findLastIndex(t => t > 20)); // 3

find pesquisa a partir do início e retorna o primeiro elemento correspondente. findIndex retorna seu índice. As formas com Last pesquisam de trás para frente. Os quatro param quando encontram a correspondência solicitada.

MétodoResultado com correspondênciaResultado sem correspondência
find, findLastElementoundefined
findIndex, findLastIndexÍndice-1
filterVetor com todas as correspondências[]

temps.find(t => t > 30) retorna undefined; temps.findIndex(t => t > 30) retorna -1. Antes de passar um índice encontrado para splice, verifique i !== -1. Caso contrário, splice(-1, 1) remove o último elemento mesmo que nenhuma correspondência tenha sido encontrada.

Preserve correspondências avaliadas como falsas

[3, 0, 5].find(n => n < 1) retorna 0, uma correspondência bem-sucedida. if (result) trata esse resultado incorretamente como falha porque zero é avaliado como falso. Para dados numéricos, result !== undefined distingue zero de ausência de correspondência. Se um vetor puder conter undefined como valor correspondente, use findIndex e compare o resultado com -1; o valor sozinho não distingue esses casos.

filter é adequado quando todas as correspondências são necessárias. [5, 12, 8, 130].filter(n => n > 10) produz [12, 130]; find retorna apenas 12. Usar filter(...)[0] calcula todo o vetor de correspondências antes de ler seu primeiro valor.

Teste algum ou todos
const scores = [72, 85, 49];
const anyFailed = scores.some(s => s < 50); // true
const allPassed = scores.every(s => s >= 50); // false

some para no primeiro sucesso. every para na primeira falha. Suas respostas são booleanos, não elementos. Nessas chamadas, o 49 faz some ter sucesso e every falhar.

Para um vetor vazio, some retorna false porque nada passa. every retorna true porque nada falha. Se um conjunto completo de resultados precisar conter pelo menos uma nota, combine os testes: scores.length > 0 && scores.every(s => s >= 50). A condição de tamanho trata o caso vazio; every verifica os elementos.

Escolha entre pertinência exata e teste personalizado

includes("ana") procura exatamente esse valor. Uma busca que não diferencia maiúsculas de minúsculas precisa de uma função de retorno: names.some(n => n.toLowerCase() === "ana"). Isso pode aceitar tanto “Ana” quanto “ANA”. Use includes para um valor conhecido e uma busca com função de retorno quando cada elemento precisar ser testado por uma regra.

Principais conclusões

  • Escolha valor, índice, vetor ou booleano conforme o resultado necessário.
  • findLast e findLastIndex pesquisam a partir do fim.
  • Compare um índice com -1 antes de usá-lo para alterar um vetor.
  • Um elemento avaliado como falso, como 0, pode ser uma correspondência real.
  • some para em um sucesso; every para em uma falha.
  • Vetores vazios produzem false para some e true para every.

4.4 Carregar um resultado com reduce

reduce carrega um acumulador de um elemento para o seguinte. Sua função de retorno retorna o acumulador para a próxima etapa. Após o último elemento, o método retorna esse valor final.

Acompanhe uma soma
const temps = [18, 21, 19, 24];
const total = temps.reduce((sum, t) => sum + t, 0);
// total is 82

O 0 é o acumulador inicial. A função de retorno recebe sum primeiro e a temperatura atual t em segundo. A soma retornada torna-se o primeiro argumento da próxima chamada.

Acumulador antesElementoAcumulador retornado
01818
182139
391958
582482

Essa é a mesma soma acumulada de um laço com let sum = 0. Uma função de retorno também tem argumentos opcionais de índice e vetor após o acumulador e o elemento. Os nomes dos parâmetros são flexíveis, mas sua ordem é fixa.

Forneça um valor inicial útil

Com um valor inicial, a redução começa no primeiro elemento. Sem ele, o primeiro elemento presente torna-se o acumulador e as chamadas da função de retorno começam no próximo elemento presente. Em um vetor vazio, omitir o valor inicial lança um TypeError. [].reduce((sum, n) => sum + n, 0) retorna 0 com segurança porque nenhuma chamada da função de retorno é necessária.

O valor inicial também estabelece o tipo de resultado. Use 0 para somas ou contagens e "" para texto. ["a", "b", "c"].reduce((text, s) => text + s.toUpperCase(), "") constrói “ABC”. Uma soma numérica que começa com uma cadeia de caracteres pode concatenar texto acidentalmente por meio de +.

Conte e encontre um extremo
const scores = [72, 85, 49];
const passed = scores.reduce(
  (count, s) => s >= 50 ? count + 1 : count,
  0
);
// passed is 2

Uma aprovação adiciona um; uma reprovação retorna a contagem inalterada. Cada ramo fornece um próximo acumulador. Para um máximo, retorne o maior valor: [-3, -7, -1, -5].reduce((max, n) => n > max ? n : max, -Infinity) produz -1. Começar em zero estaria errado para essa lista só de valores negativos. Uma entrada vazia deixa -Infinity, então trate esse resultado quando um máximo real for necessário.

Retorne em todos os caminhos

Uma função de retorno em bloco precisa de return. (sum, n) => { sum + n; } retorna undefined, então o resultado final da redução é undefined. Um retorno ausente em parte dos caminhos também é perigoso. Em uma contagem sobre [72, 49, 85], retornar apenas para uma aprovação produz primeiro 1, depois undefined em 49 e, em seguida, NaN ao adicionar um em 85. Retorne o acumulador inalterado quando um elemento não contribuir.

Combine operações sem ocultar a tarefa

A soma das notas de aprovação é scores.filter(s => s >= 50).reduce((sum, s) => sum + s, 0), que produz 157. Uma média precisa de uma contagem separada: temps.reduce((sum, t) => sum + t, 0) / temps.length produz 20,5 °C. Verifique o tamanho primeiro, pois uma entrada vazia produz NaN após a divisão. Se uma função de retorno começar a fazer várias tarefas não relacionadas, um laço for...of pode mostrar os resultados que mudam com mais clareza.

Principais conclusões

  • reduce passa primeiro o acumulador e depois o elemento.
  • A função de retorno deve retornar o próximo acumulador em todos os caminhos.
  • Um valor inicial explícito torna previsível o comportamento com entrada vazia.
  • Escolha o valor inicial para o resultado: soma, contagem, texto ou extremo.
  • Uma média precisa de uma soma e de uma contagem diferente de zero.
5

Ordenar, copiar e combinar vetores

Ordenar uma lista e copiá-la são escolhas separadas. Uma ordenação numérica precisa de regras de comparação diferentes das usadas para uma lista de nomes, e o idioma afeta a ordem esperada pelos leitores. Decida se a sequência original deve ser preservada antes de escolher um método de alteração ou cópia. Referências e cópias superficiais explicam quais alterações posteriores permanecem locais e quais continuam visíveis por outro nome do vetor.

5.1 Ordenar números e preservar o original

Ordenar escolhe uma ordem comparando elementos. Inverter simplesmente inverte a ordem existente. Ambas as operações têm métodos que alteram um vetor e métodos que criam uma cópia.

Entenda a ordem padrão

[10, 9, 1, 100].sort() produz [1, 10, 100, 9]. Sem uma função de comparação, sort compara os elementos como cadeias de caracteres, caractere por caractere, usando unidades de código UTF-16. “100” começa com “1”, que vem antes de “9”. Os elementos armazenados continuam sendo números; apenas a comparação usa sua forma de texto.

Para cadeias de caracteres, esse padrão também pode surpreender os leitores. ["banana", "Cherry", "apple"].sort() produz ["Cherry", "apple", "banana"], pois as letras ASCII maiúsculas vêm antes das minúsculas. Letras acentuadas podem ficar separadas das letras com as quais os leitores as agrupam. Use uma comparação que considere o idioma para a ordem alfabética usada pelas pessoas.

Retorne o sinal correto

Uma função de comparação recebe dois elementos, a e b. Um retorno negativo coloca a antes de b; um retorno positivo o coloca depois de b; zero os trata como iguais para a ordenação.

const nums = [10, 9, 1, 100];
nums.sort((a, b) => a - b);
// nums is [1, 9, 10, 100]

Comparar 10 com 9 produz o valor positivo 1, então 9 vem antes de 10. Para ordem numérica decrescente, use (a, b) => b - a. Retorne um número com um sinal significativo. (a, b) => a > b retorna apenas true ou false, que se tornam 1 ou 0; ele nunca indica que a deve vir antes de b. Esse comparador produz uma ordenação não confiável.

A ordenação é estável: elementos comparados como iguais mantêm sua ordem relativa original. ["kiwi", "fig", "pear", "plum"].sort((a, b) => a.length - b.length) produz ["fig", "kiwi", "pear", "plum"]. As três palavras de quatro letras mantêm sua ordem.

Escolha entre mutação e cópia
MétodoEfeito na origemVetor retornado
sort(compare)Ordena a própria origemMesmo vetor
toSorted(compare)Deixa a origem inalteradaNovo vetor ordenado
reverse()Inverte a própria origemMesmo vetor
toReversed()Deixa a origem inalteradaNovo vetor invertido

const sorted = scores.sort((a, b) => a - b); fornece um segundo nome para o mesmo vetor, agora ordenado. Ele não preserva a ordem anterior. Para um novo vetor ordenado, use scores.toSorted((a, b) => a - b) ou faça uma cópia por espalhamento antes de sort.

[3, 1, 2].toReversed() produz [2, 1, 3]. Essa é uma sequência invertida, não uma ordem numérica decrescente. Para colocar os maiores valores primeiro, use um comparador decrescente ou ordene em ordem crescente antes de inverter.

Verifique os tipos antes de ordenar texto numérico

Valores de split são cadeias de caracteres. ["10", "9", "100"].sort() produz ["10", "100", "9"]. A subtração em um comparador converte cadeias numéricas durante a comparação, mas deixa os elementos como cadeias. Converta primeiro com map(Number) quando os valores forem dados numéricos e depois use um comparador numérico. Isso também prepara os dados para adição posterior sem concatenação acidental de texto.

Principais conclusões

  • A ordenação padrão compara texto, mesmo para elementos numéricos.
  • Use a - b para números em ordem crescente e b - a para ordem decrescente.
  • Um comparador retorna um número negativo, zero ou um número positivo.
  • Comparações iguais preservam a ordem relativa.
  • sort e reverse alteram o vetor; toSorted e toReversed criam cópias.
  • Inverter a ordem atual não necessariamente a ordena.

5.2 Ordenar e formatar dados para o leitor

As pessoas esperam que a ordem do texto e a formatação dos números sigam as convenções de um idioma. Mantenha os valores em formatos fáceis de processar, escolha uma configuração regional explícita para comparar texto e formate a saída final para o leitor.

Compare texto com regras de configuração regional

a.localeCompare(b, locale) retorna um número negativo quando a vem antes de b, um número positivo quando vem depois e zero quando são comparados como iguais. Apenas o sinal é garantido, não um -1 ou 1 exato.

const names = ["Zoe", "Émile", "adam"];
const sorted = names.toSorted((a, b) => a.localeCompare(b, "en"));
// sorted is ["adam", "Émile", "Zoe"]

Uma configuração regional é uma etiqueta de idioma como “en”, “de” ou “sv”. O alemão coloca “ä” antes de “z”, enquanto o sueco o coloca depois de “z”. Passe o idioma pretendido da página para tornar essa escolha explícita. Sem uma configuração regional, as configurações padrão do ambiente de execução decidem a ordem.

Comparações simples com < ainda comparam códigos de caracteres. Subtrair palavras produz NaN, que age como uma comparação de igualdade na ordenação; isso não cria ordem alfabética.

Defina opções úteis de comparação

Com { numeric: true }, sequências de algarismos são comparadas numericamente. Ordenar ["file10", "file2", "file1"] com (a, b) => a.localeCompare(b, "en", { numeric: true }) produz ["file1", "file2", "file10"]. Uma ordenação simples de texto coloca “file10” antes de “file2”.

Em inglês, { sensitivity: "base" } trata variantes de maiúsculas, minúsculas e acentos como “a”, “A” e “á” como iguais. Essas regras dependem do idioma: o sueco trata “a” e “ä” como letras de base diferentes. Use a configuração regional pretendida tanto para comparar correspondências quanto para ordenar.

Para muitas comparações, reutilize um comparador de texto:

const collator = new Intl.Collator("en", { numeric: true });
const sorted = files.toSorted(collator.compare);

collator.compare já é uma função de comparação. Criá-la uma vez evita configurar repetidamente as mesmas opções regionais durante uma ordenação grande.

Ordene datas antes de formatá-las

Cadeias YYYY-MM-DD de largura fixa colocam o ano antes do mês e do dia. A ordenação de texto segue então a ordem das datas: ["2026-03-15", "2025-11-02", "2026-01-20"].sort() produz ["2025-11-02", "2026-01-20", "2026-03-15"].

Textos com o dia primeiro, como “15/03/2026” e “20/01/2025”, comparam o dia primeiro, então podem colocar o ano posterior primeiro. Armazene e ordene essas datas no formato ISO e produza o texto de exibição ao final.

Construa listas e números legíveis

join(", ") usa o mesmo separador em todas as posições. Intl.ListFormat adiciona o conector final do idioma:

const list = new Intl.ListFormat("en-US", {
  style: "long", type: "conjunction"
});
list.format(["Ana", "Ben", "Cleo"]);
// "Ana, Ben, and Cleo"

“en-GB” produz “Ana, Ben and Cleo”; “nl” produz “Ana, Ben en Cleo”. Uma disjunção usa “or” em inglês. Dois nomes produzem “Ana and Ben” sem vírgula.

(1234.5).toLocaleString("en-US") produz “1,234.5”, enquanto “de-DE” produz “1.234,5”. Esses resultados são cadeias de caracteres. Ordene os dados numéricos antes de aplicar toLocaleString com map; formatar primeiro substitui valores numéricos por texto cuja pontuação afeta a ordenação textual.

Principais conclusões

  • Use localeCompare ou um Intl.Collator reutilizável para uma ordem adequada ao idioma.
  • Use o sinal do resultado da comparação, não um -1 ou 1 exato.
  • numeric: true ordena sequências de algarismos naturalmente dentro de nomes.
  • Cadeias de data ISO de largura fixa são ordenadas cronologicamente como texto.
  • Intl.ListFormat adiciona um conector adequado ao idioma.
  • Ordene os números primeiro e formate-os por último.

5.3 Copiar vetores sem compartilhar alterações acidentais

Uma variável de vetor contém uma referência a um vetor. Atribuir essa variável a outro nome compartilha o vetor. A sintaxe de espalhamento pode criar um novo vetor externo, combinar listas ou passar elementos como argumentos separados para uma função.

Distinga atribuição de cópia
const a = [1, 2, 3];
const b = a;
b.push(4);
// a and b both refer to [1, 2, 3, 4].
console.log(a === b); // true

Há um vetor com dois nomes. const não impede que qualquer um dos nomes seja usado para alterá-lo. Um novo vetor externo exige uma operação de cópia:

const c = [...a];
c.push(5);
// c is [1, 2, 3, 4, 5]; a stays [1, 2, 3, 4].
console.log(c === a); // false

Os três pontos distribuem os elementos de a dentro de um novo literal de vetor. Omiti-los tem um efeito diferente: [a] cria um vetor de um elemento cujo elemento é o vetor a inteiro. [...a] contém os elementos de a individualmente.

Combine e insira

[...[1, 2], ...[3, 4]] produz [1, 2, 3, 4], assim como [1, 2].concat([3, 4]). [...first, 99, ...second] coloca um elemento extra entre duas listas. [...list, "new"] cria um vetor ampliado, enquanto list.push("new") altera o existente. O espalhamento preserva a ordem dos elementos de cada entrada.

Reconheça uma cópia superficial
const grid = [[1, 2], [3, 4]];
const copy = [...grid];
copy[0].push(9);
// grid[0] and copy[0] are both [1, 2, 9].

Os vetores externos são diferentes, mas seus elementos de linha ainda apontam para os mesmos vetores internos. Isso é uma cópia superficial. Substituir copy[0] por uma nova linha alteraria apenas o vetor externo copiado; alterar a linha existente modifica a linha compartilhada. structuredClone(grid) cria uma cópia profunda independente desses vetores aninhados.

Espalhe valores em uma chamada

Math.max(...[3, 9, 4]) fornece três argumentos separados e retorna 9. Passar o vetor diretamente, Math.max([3, 9, 4]), fornece um vetor e produz NaN. Um espalhamento vazio produz Math.max(...[]) === -Infinity e Math.min(...[]) === Infinity.

Vetores muito grandes podem exceder o limite de argumentos de um motor quando espalhados em uma chamada. Não há uma quantidade segura universal de elementos. Use um laço ou reduce para encontrar um extremo em uma entrada grande. O espalhamento em um literal de vetor não cria uma lista de argumentos de função.

Espalhe cadeias de caracteres e atualize cópias

[..."hello"] produz cinco cadeias de letras. O espalhamento de cadeias de caracteres visita pontos de código Unicode: [..."a😀"] tem dois elementos, enquanto "a😀".split("") tem três unidades de código UTF-16. Alguns símbolos visíveis combinam vários pontos de código, então o espalhamento não é uma contagem geral de caracteres visíveis. Um número não é iterável; [...5] lança um TypeError.

Em uma lista de parâmetros, function total(...nums) usa rest para reunir argumentos em um vetor. O espalhamento em uma chamada faz o oposto: fornece argumentos separados.

Para atualizações baseadas em cópias, [10, 20, 30].with(1, 25) produz [10, 25, 30] e .toSpliced(1, 1) produz [10, 30]. toSorted e toReversed também preservam a origem. Essas são cópias superficiais, então a mesma regra de compartilhamento dos vetores internos se aplica.

Principais conclusões

  • A atribuição compartilha um vetor; o espalhamento em um literal cria um novo vetor externo.
  • Omitir o espalhamento aninha um vetor como um elemento.
  • O espalhamento pode combinar vetores e inserir elementos extras sem mutação.
  • Uma cópia superficial ainda compartilha vetores internos; structuredClone copia esses vetores aninhados em profundidade.
  • O espalhamento em uma chamada fornece argumentos separados e não é adequado para entradas de tamanho ilimitado.
  • O espalhamento de cadeias de caracteres visita pontos de código; parâmetros rest reúnem argumentos.
  • with e toSpliced criam cópias alteradas.

Exercícios resolvidos de Laços e vetores em JavaScript

5 Lições Interativas

1

Acompanhar um laço da primeira verificação até a saída

12 passos
Acompanhe um contador e uma soma acumulada, compare laços verificados antes e depois do corpo e controle uma busca aninhada.
  1. 1
    IntroduçãoAcompanhe o que muda

    Um laço repete um corpo, mas seu resultado depende da ordem das verificações e alterações. Vamos acompanhar uma pequena soma, uma iteração por vez, depois escolher um laço baseado em condição (while verifica primeiro, do...while depois de uma execução) e controlar uma busca aninhada com break e continue para sair ou pular.

    Mantenha duas perguntas separadas: qual valor chega ao corpo e qual valor faz a próxima verificação falhar? A última verificação que falha faz parte do fluxo de controle, embora não execute o corpo.

  2. 2
    ExemploPrepare uma soma acumulada

    Queremos a soma de 2, 4 e 6. O contador escolhe cada número, enquanto um acumulador separado mantém sua soma.

    let total = 0;
    for (let n = 2; n <= 6; n += 2) {
      total += n;
    }
    

    A inicialização define n como 2 uma vez. A primeira verificação, 2 <= 6, passa. A primeira execução do corpo soma dois a zero, deixando total em 2. A atualização então muda n para 4.

  3. 3
    ExemploAcompanhe as verificações restantes

    A próxima verificação aceita 4, então a soma torna-se 2 + 4, ou 6. A atualização leva o contador a 6, que ainda passa em n <= 6. Adicionar esse último valor faz a soma chegar a 12.

    Depois, a atualização muda n para 8. Agora 8 <= 6 é falso e o laço para. O corpo executou três vezes e a condição foi verificada quatro vezes. Nenhum oito foi adicionado à soma.

  4. 4
    DesafioAltere um limite

    Se o laço acima usasse n < 6 em vez de n <= 6, qual seria sua soma final e por quê?

    ---reveal---

    A soma seria 6: apenas 2 e 4 chegam ao corpo. Em n = 6, a condição já é falsa, então seis nunca é adicionado. A atualização ainda chega a seis, mas alcançar um valor no cabeçalho não garante uma iteração que o use.

  5. 5
    ExplicaçãoDeixe um resultado decidir quando parar

    Suponha que o tamanho de um lote comece em 5 e dobre até atingir pelo menos 30. Um laço while pode expressar diretamente o trabalho que falta.

    let size = 5;
    let rounds = 0;
    while (size < 30) {
      size *= 2;
      rounds++;
    }
    

    Os tamanhos passam a ser 10, 20 e 40. O laço termina com três rodadas, pois quarenta é o primeiro tamanho alcançado para o qual não é necessário dobrar novamente.

  6. 6
    Ideia-chaveDecida se uma primeira execução é necessária

    Um laço while verifica antes de fazer qualquer coisa. Se o tamanho inicial já for 40, o laço anterior executa zero vezes. Um laço do...while o dobraria uma vez antes de descobrir que outra execução é desnecessária.

    Use essa verificação posterior quando uma execução fizer parte da tarefa. Contar algarismos removendo um de cada vez exige contar zero como um número de um algarismo, o que torna útil uma primeira execução do corpo.

  7. 7
    DesafioLeia um laço com verificação posterior

    Quais são os valores de n e runs após este código?

    let n = 1;
    let runs = 0;
    do {
      n *= 3;
      runs++;
    } while (n < 8);
    

    ---reveal---

    n é 9 e runs é 2. O primeiro corpo produz três e a verificação passa. O segundo produz nove e sua verificação falha. O teste ocorre após cada multiplicação, então o valor final pode ultrapassar o limite.

  8. 8
    ExemploPule um valor sem encerrar o laço

    Este laço imprime apenas os valores permitidos do contador.

    for (let n = 1; n <= 5; n++) {
      if (n === 3) continue;
      console.log(n);
    }
    

    Ele imprime 1, 2, 4, 5. Em três, continue pula a impressão, mas a atualização do cabeçalho ainda avança para quatro. Com break, todo o laço pararia em três e nenhum valor posterior seria impresso.

  9. 9
    DesafioEncontre uma atualização que é pulada

    Por que este código deixa de avançar em n = 2?

    let n = 0;
    while (n < 4) {
      if (n === 2) continue;
      n++;
    }
    

    ---reveal---

    Continue salta diretamente para a condição do while e pula n++. Em dois, toda verificação posterior é verdadeira e toda execução do corpo pula a atualização novamente. Incremente nesse ramo antes de continuar ou use um laço for cujo cabeçalho faça a atualização.

  10. 10
    ExemploAcompanhe uma busca interna

    Para cada valor externo, um laço interno recomeça.

    for (let a = 1; a <= 3; a++) {
      for (let b = 1; b <= 4; b++) {
        if (a * b === 6) break;
        console.log(a, b);
      }
    }
    

    Em a = 2, chegar a b = 3 encerra esse laço interno antes de imprimir o par. O laço externo ainda avança para três. Um break comum controla apenas o laço mais interno.

  11. 11
    DesafioEncerre toda a busca aninhada

    A busca aninhada deve parar completamente em seu primeiro produto igual a seis. Que alteração consegue isso e qual par a aciona?

    ---reveal---

    Rotule o laço externo com outer: e substitua o break por break outer;. O primeiro par correspondente é a = 2, b = 3: a primeira linha não tem produto igual a seis, depois a segunda linha o alcança em sua terceira coluna. Ambos os laços terminam nesse ponto, então a terceira linha nunca executa.

  12. 12
    RecapitulaçãoLeia o caminho de execução

    Acompanhe a inicialização uma vez e depois siga cada condição, corpo e atualização em ordem. Conte apenas entradas bem-sucedidas no corpo como iterações.

    Um laço while pode pular o corpo por completo; um laço do...while não pode. Continue mantém possível a próxima iteração, mas pode desviar de uma atualização de while. Break encerra seu laço, e um rótulo pode estender essa saída a uma busca externa. Em cada caso, identifique a próxima instrução alcançada pela execução.

2

Acompanhar um vetor e o resultado de cada método

11 passos
Leia dados indexados, acompanhe uma inserção e uma remoção e transforme uma lista pesquisada em texto para exibição.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoAcompanhe dois resultados de uma alteração
  2. 2
    ExemploRelacione valores a índices
  3. 3
    DesafioLeia um planejamento aninhado
  4. 4
    ExemploAdicione uma tarefa e guarde seu retorno
  5. 5
    ExemploSubstitua uma tarefa com splice
  6. 6
    DesafioCopie um trecho
  7. 7
    ExplicaçãoPesquise uma posição explicitamente
  8. 8
    DesafioDivida e una texto
  9. 9
    Ideia-chaveMantenha texto numérico separado de números
  10. 10
    DesafioPesquise antes de remover
  11. 11
    RecapitulaçãoSepare posições, alterações e texto
3

Transformar um laço em um resultado útil

10 passos
Escolha um percurso, calcule uma soma e uma contagem e construa variações entre medições vizinhas.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoEscolha o que o corpo precisa
  2. 2
    ExplicaçãoLeia valores diretamente
  3. 3
    DesafioVisite posições de dois em dois
  4. 4
    ExemploSome o total e conte viagens longas
  5. 5
    ExemploUse a soma concluída
  6. 6
    DesafioEncontre um extremo sem inventar zero
  7. 7
    ExemploConstrua diferenças entre vizinhos
  8. 8
    DesafioMantenha apenas aumentos
  9. 9
    DicaRemova a partir do fim quando os índices mudarem
  10. 10
    RecapitulaçãoEscolha um início para cada resultado
4

Acompanhar uma sequência de funções de retorno

15 passos
Retorne valores de funções de retorno, selecione e transforme medições, pesquise-as e acompanhe uma redução.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDeixe o método gerenciar as visitas
  2. 2
    ExplicaçãoRetorne uma expressão ou o resultado de um bloco
  3. 3
    DesafioEscolha um método para saída impressa
  4. 4
    ExemploMantenha as medições selecionadas
  5. 5
    ExemploTransforme os valores selecionados
  6. 6
    DesafioMantenha zeros válidos
  7. 7
    ExplicaçãoPesquise um valor ou sua posição
  8. 8
    DesafioReconheça uma correspondência igual a zero
  9. 9
    Ideia-chaveAlgum e todos chegam à resposta em momentos diferentes
  10. 10
    ExemploInicie uma redução explicitamente
  11. 11
    DicaMantenha um próximo acumulador em todos os caminhos
  12. 12
    DesafioAcompanhe uma soma filtrada
  13. 13
    DesafioDiagnostique uma função de retorno de conversão
  14. 14
    DesafioEscolha todas as correspondências ou uma correspondência
  15. 15
    RecapitulaçãoLeia cada formato retornado
5

Preservar dados ao ordená-los e formatá-los

13 passos
Escolha regras de comparação, ordene dados numéricos antes de formatá-los e acompanhe o comportamento de cópias superficiais.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoFaça da ordem e da identidade escolhas separadas
  2. 2
    ExemploVerifique a ordem padrão
  3. 3
    ExplicaçãoUse o sinal do comparador
  4. 4
    DesafioProteja a ordem da origem
  5. 5
    ExemploDeixe o idioma decidir a ordem do texto
  6. 6
    DesafioOrdene rótulos numerados
  7. 7
    ConexãoConclua os cálculos antes da exibição
  8. 8
    ExemploDê um segundo nome ao mesmo vetor
  9. 9
    ExemploCopie a lista externa
  10. 10
    DesafioEncontre uma linha interna compartilhada
  11. 11
    DicaPasse argumentos sem criar uma chamada enorme
  12. 12
    DesafioCombine ordenação, cópia e formatação
  13. 13
    RecapitulaçãoAcompanhe o que é compartilhado e o que é retornado

Questões de Laços e vetores em JavaScript

40 Questões de Prática em 4 conjuntos

Conjunto 1: Acompanhar laços e ler posições em vetores10 Questões de Prática

Questão 1 de 10

Quantas vezes o corpo deste laço executa?

for (let i = 2; i < 7; i++) {
  console.log(i);
}
  1. 4 vezes
  2. 6 vezes
  3. 5 vezes
  4. 7 vezes
Mostrar respostaOcultar resposta
Resposta: C
O corpo executa com os valores 2, 3, 4, 5 e 6 do contador, produzindo cinco iterações. Em 7, a condição é falsa antes que o corpo possa executar. Contar seis iterações incluiria essa verificação que falha como se fosse outra execução do corpo.

Questão 2 de 10

O que ["oak", "pine", "elm", "fir"].at(-2) retorna?
  1. "elm"
  2. "pine"
  3. "fir"
  4. undefined
Mostrar respostaOcultar resposta
Resposta: A
Um índice negativo em at conta de trás para frente: -1 é o último elemento, “fir”, e -2 é “elm”. “pine” está no índice positivo 1; tratar o índice negativo como uma posição positiva comum seleciona a extremidade errada da lista.

Questão 3 de 10

Qual valor é impresso?

let n = 8;
do {
  n -= 3;
} while (n > 6);
console.log(n);
  1. 8
  2. 2
  3. 6
  4. 5
Mostrar respostaOcultar resposta
Resposta: D
O corpo executa antes da primeira verificação e subtrai três de oito, restando cinco. A condição 5 > 6 é então falsa, e a execução para. Oito seria o resultado de tratar incorretamente o laço como um while verificado antes do corpo, que nunca entra nele.

Questão 4 de 10

Qual valor total contém depois?

let total = 0;
for (let n = 3; n <= 9; n += 3) {
  total += n;
}
  1. 9
  2. 18
  3. 12
  4. 15
Mostrar respostaOcultar resposta
Resposta: B
O contador visita 3, 6 e 9; a soma torna-se 3, depois 9 e depois 18. A condição <= inclui o nove final. Uma soma de nove adiciona apenas os dois primeiros valores visitados e perde o limite final em vez de manter as três contribuições.

Questão 5 de 10

Quais números são impressos, em ordem?

for (let n = 2; n <= 7; n++) {
  if (n === 4) continue;
  if (n === 6) break;
  console.log(n);
}
  1. 2, 3
  2. 2, 3, 5, 6
  3. 2, 3, 5, 7
  4. 2, 3, 5
Mostrar respostaOcultar resposta
Resposta: D
Em quatro, continue pula a impressão, mas ainda permite a atualização do contador. Cinco é impresso em seguida; em seis, break encerra o laço antes da impressão. A sequência que termina em três confunde continue com uma saída antecipada, enquanto um sete posterior exigiria que o laço continuasse após o break.

Questão 6 de 10

Qual par de valores resulta de grid.length e grid[1][2]?

const grid = [[6, 2, 8], [9, 5, 1]];
  1. 3 e 1
  2. 2 e 1
  3. 2 e 5
  4. 6 e 8
Mostrar respostaOcultar resposta
Resposta: B
O vetor externo contém dois vetores de linha, então seu tamanho é dois. O índice 1 seleciona [9, 5, 1], e o índice 2 dentro dessa linha seleciona um. Informar tamanho três usa o tamanho de uma linha para o vetor externo, confundindo os dois níveis.

Questão 7 de 10

Quantas iterações são executadas antes de este laço terminar?

let size = 3;
let rounds = 0;
while (size < 20) {
  size *= 2;
  rounds++;
}
  1. 3 iterações
  2. 2 iterações
  3. 4 iterações
  4. 6 iterações
Mostrar respostaOcultar resposta
Resposta: A
Os tamanhos sucessivos após cada iteração são 6, 12 e 24. Os dois primeiros ainda permitem outra iteração, mas 24 < 20 é falso, então a contagem final é três. Duas iterações parariam em doze, embora a condição do laço ainda exija mais trabalho.

Questão 8 de 10

Quantas vezes count++ executa?

let count = 0;
for (let a = 0; a < 4; a++) {
  for (let b = a + 1; b < 4; b++) {
    if (b === 3) break;
    count++;
  }
}
  1. 2 vezes
  2. 4 vezes
  3. 3 vezes
  4. 6 vezes
Mostrar respostaOcultar resposta
Resposta: C
Para a = 0, o incremento executa em b = 1 e 2; para a = 1, executa em b = 2. Em b = 3, cada laço interno é interrompido antes do incremento, e a = 3 não tem iterações internas. Seis conta todos os pares distintos, mas ignora as saídas antecipadas.

Questão 9 de 10

Esta conversão deve imprimir os mesmos valores de um laço de contagem que pula 2. Como ela pode ser corrigida mantendo a forma while?

let i = 0;
while (i < 4) {
  if (i === 2) continue;
  console.log(i);
  i++;
}
  1. Use if (i === 2) { break; }.
  2. Use if (i === 2) { i++; continue; }.
  3. Mova i++ para imediatamente antes de console.log(i).
  4. Altere a condição para i <= 4.
Mostrar respostaOcultar resposta
Resposta: B
Em dois, o código atual salta para a condição sem atualizar e fica preso. Incrementar dentro desse ramo antes de continuar pula dois e permite imprimir três, produzindo 0, 1, 3. Substituir continue por break encerra em dois e perde o valor posterior necessário.

Questão 10 de 10

O que [9, 2, 9].lastIndexOf(9) retorna?
  1. 0
  2. 3
  3. 2
  4. 9
Mostrar respostaOcultar resposta
Resposta: C
O último nove ocupa o índice dois, contado a partir de zero, então lastIndexOf retorna dois. Zero é a posição do primeiro nove e seria retornado por indexOf. O método informa uma posição, não o valor correspondente ou o tamanho do vetor.
Conjunto 2: Alterar vetores e construir resultados com laços10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

O que size contém após estas instruções?

const tags = ["new", "open"];
const size = tags.push("done");
  1. ["new", "open", "done"]
  2. 3
  3. "done"
  4. 2
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Quais são os valores de cut e data depois?

const data = [4, 8, 12, 16];
const cut = data.splice(1, 2, 7);
  1. cut = [8]; data = [4, 7, 12, 16]
  2. cut = [4, 7, 16]; data = [8, 12]
  3. cut = [8, 12]; data = [4, 8, 12, 16]
  4. cut = [8, 12]; data = [4, 7, 16]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma busca deve reconhecer um valor no índice zero e rejeitar um valor ausente. Qual condição deve substituir if (items.indexOf(target))?
  1. if (items.indexOf(target) !== -1)
  2. if (items.indexOf(target) > 0)
  3. if (items.indexOf(target) !== 0)
  4. if (items.indexOf(target) === 1)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Qual cabeçalho de laço fornece cada valor de texto de labels em ordem?
  1. for (const label in labels)
  2. for (const label of labels.length)
  3. for (const label of labels)
  4. for (const label in labels.length)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Qual é o valor final de count?

let count = 0;
for (const n of [11, 6, 14, 9]) {
  if (n >= 10) count++;
}
  1. 2
  2. 4
  3. 25
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

O que permanece em values após este código?

const values = [3, 6, 8, 9];
for (let i = 0; i < values.length; i++) {
  if (values[i] % 3 === 0) values.splice(i, 1);
}
  1. [8]
  2. [6, 8, 9]
  3. [3, 8]
  4. [6, 8]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Qual valor resulta de "7;12;5".split(";").join(" / ")?
  1. [7, 12, 5]
  2. "7 / 12 / 5"
  3. "7;12;5"
  4. "7 / 12 / 5 / "
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Qual vetor é construído?

const readings = [9, 4, 8, 3];
const rises = [];
for (let i = 1; i < readings.length; i++) {
  const change = readings[i] - readings[i - 1];
  if (change > 0) rises.push(change);
}
  1. [-5, 4, -5]
  2. [8]
  3. [4]
  4. [5, 5]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Quais são o tamanho e o elemento final de a depois?

const a = [2, 4];
a[5] = 12;
  1. Tamanho 3; elemento final 12.
  2. Tamanho 5; elemento final 12.
  3. Tamanho 6; elemento final undefined.
  4. Tamanho 6; elemento final 12.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um máximo deve ser um elemento de um vetor numérico não vazio, inclusive quando todos os valores são negativos. Por que começar em 0 pode produzir um resultado errado?
  1. Zero faz toda comparação retornar falso para dados positivos.
  2. Zero pode superar todos os elementos e nunca ser substituído.
  3. Zero faz o laço parar após seu primeiro elemento negativo.
  4. Zero é somado a cada elemento antes da comparação.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Transformar, pesquisar e reduzir vetores10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

O que [4, 7].map(n => { n + 3; }) retorna?
  1. [7, 10]
  2. undefined
  3. [4, 7]
  4. [undefined, undefined]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Qual vetor resulta desta expressão?

[5, 16, 9, 22].filter(n => n > 10).map(n => n - 2)
  1. [3, 14, 7, 20]
  2. [14, 20]
  3. [16, 22]
  4. [14]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O que [8, 0, 6].find(n => n < 2) retorna e como o sucesso deve ser testado para esse vetor numérico?
  1. undefined; teste result === undefined.
  2. 0; teste Boolean(result).
  3. 0; teste result !== undefined.
  4. 1; teste result !== -1.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Qual valor esta redução retorna?

[6, 3, 5].reduce((total, n) => total + n, 4)
  1. 18
  2. 14
  3. 10
  4. 24
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Quais valores são impressos e o que é atribuído a result?

const result = [2, 5, 8].forEach(n => {
  if (n === 5) return;
  console.log(n);
});
  1. Imprime 2; result é undefined.
  2. Imprime 2, 8; result é [2, 8].
  3. Imprime 2, 8; result é undefined.
  4. Imprime 2, 5, 8; result é undefined.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

As medições válidas incluem zero; apenas null significa ausência. Qual expressão converte todas as medições válidas em metros?

const km = [0, null, 1.2, 0.4];
  1. km.filter(n => n).map(n => n * 1000)
  2. km.map(n => n * 1000).filter(n => n !== null)
  3. km.filter(n => n !== null).map(n => n * 100)
  4. km.filter(n => n !== null).map(n => n * 1000)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que o código retorna?

[64, 40, 91].reduce((count, score) => {
  if (score >= 60) return count + 1;
}, 0)
  1. NaN
  2. 2
  3. 1
  4. undefined
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um relatório deve ser verdadeiro somente quando existir pelo menos uma nota e todas as notas forem pelo menos 70. Qual expressão trata entradas de todos os tamanhos?
  1. scores.every(s => s >= 70)
  2. scores.length > 0 && scores.every(s => s >= 70)
  3. scores.length > 0 && scores.some(s => s >= 70)
  4. scores.length > 0 || scores.every(s => s >= 70)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que esta expressão produz?

["6", "15", "4"].map(Number)
  .filter(n => n % 2 === 0)
  .map((n, i) => n + i)
  1. [6, 5]
  2. [6, 6]
  3. [6, 4]
  4. ["60", "42"]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma lista numérica não vazia precisa de seu maior valor, mesmo quando todos os valores são negativos. Qual redução atende a essa exigência?
  1. nums.reduce((best, n) => n > best ? n : best, 0)
  2. nums.reduce((best, n) => n < best ? n : best, Infinity)
  3. nums.reduce((best, n) => n > best ? n : best, -Infinity)
  4. nums.reduce((best, n) => n > best, -Infinity)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Ordenar, copiar e combinar resultados com segurança10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

O que [8, 30, 4].toSorted() retorna?
  1. [4, 8, 30]
  2. [30, 4, 8]
  3. [8, 4, 30]
  4. [8, 30, 4]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Quais vetores a e c contêm depois?

const a = [6, 2];
const b = a;
const c = [...a];
b.push(9);
c[0] = 1;
  1. a = [1, 2, 9]; c = [1, 2, 9]
  2. a = [6, 2]; c = [1, 2]
  3. a = [6, 2, 9]; c = [1, 2, 9]
  4. a = [6, 2, 9]; c = [1, 2]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Como readings pode ser ordenado do maior para o menor preservando sua sequência original?
  1. readings.toSorted((a, b) => b - a)
  2. readings.sort((a, b) => b - a)
  3. readings.toReversed()
  4. readings.toSorted((a, b) => a - b)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Qual expressão coloca "part12", "part3" e "part1" em ordem numérica natural dos nomes sem alterar parts?
  1. parts.toSorted((a, b) => a.localeCompare(b, "en"))
  2. parts.toSorted((a, b) => a - b)
  3. parts.toSorted((a, b) => a.localeCompare(b, "en", { numeric: true }))
  4. parts.toSorted((a, b) => b.localeCompare(a, "en", { numeric: true }))
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Quais são os valores de rows[0] e copy[1] depois?

const rows = [[5], [8]];
const copy = [...rows];
copy[0].push(6);
copy[1] = [2];
  1. rows[0] = [5]; copy[1] = [2]
  2. rows[0] = [5, 6]; copy[1] = [8, 2]
  3. rows[0] = [5, 6]; copy[1] = [2]
  4. rows[0] = [5]; copy[1] = [8, 2]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um programa formata [1200, 25, 4] com numbers.map(n => n.toLocaleString("de-DE")).toSorted(). Como ele deve ordenar e formatar os valores para preservar numbers e exibir a ordem numérica crescente?
  1. toSorted numérico, depois formatar: ["4", "25", "1.200"].
  2. Formatar, depois toSorted padrão: ["1.200", "25", "4"].
  3. toSorted padrão, depois formatar: ["1.200", "25", "4"].
  4. sort numérico, depois formatar: ["4", "25", "1.200"].
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Qual vetor é retornado?

["lion", "ox", "bear", "ant"]
  .toSorted((a, b) => a.length - b.length)
  .toReversed()
  1. ["lion", "bear", "ant", "ox"]
  2. ["bear", "lion", "ox", "ant"]
  3. ["ox", "ant", "lion", "bear"]
  4. ["bear", "lion", "ant", "ox"]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

O que view contém depois?

const values = [7, 2, 5];
const i = values.findIndex(n => n < 0);
values.splice(i, 1);
const view = values.toReversed();
  1. [5, 2, 7]
  2. [2, 7]
  3. [7, 2]
  4. [5, 2]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Qual é o tamanho de joined?

const left = [4, 6];
const right = [8, 10, 12];
const joined = [...left, right];
  1. 5
  2. 2
  3. 4
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Estas cadeias de data são ordenadas incorretamente no tempo: ["08/02/2027", "19/01/2026", "03/12/2026"] no formato dia/mês/ano. Quais cadeias armazenadas produzem ordem cronológica como texto para as mesmas datas?
  1. ["2026-01-19", "2026-12-03", "2027-02-08"]
  2. ["2026-03-12", "2026-19-01", "2027-08-02"]
  3. ["03/12/2026", "08/02/2027", "19/01/2026"]
  4. ["2027-02-08", "2026-12-03", "2026-01-19"]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

71 Termos-Chave, cada um com sua definição

A

Acumulador
Um acumulador é uma variável ou valor de uma função de retorno que carrega um resultado crescente de um elemento processado para o próximo.
Uma soma de temperaturas mantém o total anterior antes de adicionar a medição atual em cada etapa.
Arredondamento em ponto flutuante
O arredondamento em ponto flutuante ocorre quando um número não pode ser armazenado exatamente em binário, afetando operações aritméticas e testes de igualdade.
Adicionar 0.1 dez vezes produz 0.9999999999999999, então um limite exato de laço pode não ser alcançado.
Atualização
Uma atualização altera o estado do laço entre iterações; um laço for executa a atualização do cabeçalho após seu corpo.
A atualização i += 5 faz o próximo valor do contador ser cinco unidades maior que o anterior.

B

Busca de índice
Uma busca de índice retorna uma posição correspondente ou um marcador de ausência de correspondência; indexOf e lastIndexOf usam menos um para indicar falha.
[3, 7, 3].lastIndexOf(3) retorna 2, apontando para o último elemento correspondente.

C

Cadeia de caracteres de data no formato ISO
Uma cadeia de caracteres de data no formato ISO, na forma YYYY-MM-DD de largura fixa, coloca ano, mês e dia em uma ordem que é cronológica quando ordenada como texto.
A cadeia “2025-11-02” é ordenada antes de “2026-01-20” porque o ano é comparado primeiro.
Cadeia de métodos
Uma cadeia de métodos usa o valor retornado por uma chamada como receptor da chamada seguinte, permitindo ler uma sequência de processamento de dados da esquerda para a direita.
Uma cadeia filter-map primeiro mantém números selecionados e depois transforma apenas os números mantidos.
Comparador de texto
Um comparador de texto reúne regras de comparação regional em uma instância reutilizável de Intl.Collator com uma função de comparação pronta.
Um comparador com numeric: true ordena nomes que contêm algarismos em sequência numérica natural.
Condição do laço
Uma condição do laço é o teste que decide se outra iteração pode executar; uma verificação prévia falsa impede a execução do corpo.
Com i < 10, chegar a i = 10 encerra o laço antes de outra execução do corpo.
Configuração regional
Uma configuração regional identifica convenções de idioma ou região usadas em operações como comparação de texto e formatação de números.
A configuração regional “sv” coloca “ä” depois de “z”, enquanto a comparação alemã o coloca antes de “z”.
Contador
Um contador registra quantos eventos ou correspondências ocorreram, geralmente começando em zero e aumentando em um por correspondência.
Um contador de dias quentes aumenta apenas quando a temperatura atual passa no teste escolhido.
Cópia profunda
Uma cópia profunda duplica os dados aninhados e também seu contêiner externo, para que alterações nas linhas copiadas não afetem as linhas originais.
Para uma grade de vetores numéricos, structuredClone cria cópias independentes das linhas internas.
Cópia superficial
Uma cópia superficial cria um novo vetor externo mantendo os mesmos valores de elementos, incluindo referências a quaisquer vetores aninhados.
Adicionar um elemento com push a uma linha de uma grade copiada por espalhamento altera a linha compartilhada com a grade original.

E

Efeito colateral
Um efeito colateral é uma ação que uma função realiza além de fornecer seu valor de retorno, como imprimir ou alterar dados compartilhados.
Uma função de retorno de forEach pode imprimir um nome mesmo que o próprio método retorne undefined.
Elemento
Um elemento é um valor armazenado em uma posição de vetor; pode ser um número, uma cadeia de caracteres ou outro vetor, entre outros tipos de valor.
Em ["red", "green", "blue"], a cadeia de caracteres “green” é o elemento armazenado no índice 1.
Erro de uma unidade
Um erro de uma unidade faz um cálculo de limite ou um laço incluir uma posição extra ou deixar de incluir uma posição desejada.
Usar i <= arr.length lê um índice além do último elemento ao percorrer um vetor.
Etapa de redução
Uma etapa de redução usa o acumulador atual e um elemento para retornar o acumulador que a próxima chamada da função de retorno recebe.
Uma etapa de contagem retorna count + 1 ou a contagem inalterada, conforme o teste.

F

Formatação de listas
A formatação de listas transforma elementos de texto em uma apresentação legível com separadores e conectores escolhidos para a configuração regional do leitor.
Intl.ListFormat pode adicionar “and” antes do último nome em uma lista em inglês americano.
Formatação de números
A formatação de números converte um número em texto para exibição usando convenções como os separadores decimal e de agrupamento da configuração regional.
Formatar 1234.5 com “de-DE” produz “1.234,5”, uma cadeia para exibir após a ordenação numérica.
Função de comparação
Uma função de comparação retorna um número negativo, zero ou positivo para determinar a ordem relativa de dois valores durante a ordenação.
O comparador (a, b) => a - b coloca valores numéricos menores antes dos maiores.
Função de retorno
Uma função de retorno é uma função passada a outra função, que a invoca como parte de seu trabalho, frequentemente para cada elemento de um vetor.
Map chama sua função de retorno com um elemento e usa o valor retornado no novo vetor.
Função de seta
Uma função de seta usa a sintaxe de seta para definir uma função, frequentemente de modo compacto, com parâmetros seguidos de uma expressão retornada.
A função de retorno n => n * 2 recebe um número e retorna um valor duas vezes maior.

I

Identidade do vetor
A identidade do vetor distingue um vetor de outro, mesmo quando ambos contêm atualmente os mesmos valores ordenados.
[1, 2] === [1, 2] é falso porque os literais criam dois vetores separados.
Indicador booleano
Um indicador booleano é um valor que registra se uma condição foi satisfeita, como encontrar uma correspondência ou uma falha.
Um indicador de aprovação de todos começa verdadeiro e muda para falso quando aparece uma nota de reprovação.
Inicialização
A inicialização estabelece o estado inicial de um laço; em um laço for, ela executa uma vez antes da primeira verificação da condição.
Em for (let i = 1; i <= 5; i++), a inicialização cria i com o valor inicial 1.
Instrução break
Uma instrução break sai imediatamente do laço que a contém, ou de um laço especificado por rótulo, e retoma a execução depois dele.
Uma busca pela primeira correspondência usa break para que valores posteriores não sejam verificados após uma correspondência ser armazenada.
Instrução continue
Uma instrução continue pula o restante do código do corpo na iteração atual e segue o caminho da próxima etapa do laço.
Uma verificação de números pares pode usar continue para pular a impressão enquanto um contador de laço for ainda é atualizado.
Interrupção antecipada
A interrupção antecipada encerra um percurso assim que seu resultado está definido, evitando verificações posteriores que não podem mudar a resposta.
Uma busca com find para na primeira correspondência, enquanto every para no primeiro teste que falha.
Inversão da ordem
Uma inversão da ordem inverte a sequência atual, do último para o primeiro, sem comparar valores para estabelecer uma ordem numérica ou alfabética.
Inverter [3, 1, 2] produz [2, 1, 3], que não é uma sequência ordenada numericamente.
Iteração
Uma iteração é uma execução do corpo de um laço, que ocorre após uma verificação bem-sucedida da condição em um laço de contagem.
Imprimir os números de 1 a 5 com uma impressão por execução do corpo exige cinco iterações.
Iterável
Um iterável fornece uma sequência de valores que operações como for...of e espalhamento podem visitar em ordem.
Vetores e cadeias de caracteres são iteráveis, mas espalhar o número 5 em um vetor lança um TypeError.

Í

Índice
Um índice identifica uma posição em um vetor; os elementos indexados comuns são contados de zero até uma unidade a menos que o tamanho.
O terceiro elemento é lido com colors[2] porque a indexação começa em zero, antes do índice um.

L

Laço aninhado
Um laço aninhado é um laço dentro de outro; sua sequência interna executa novamente para cada iteração que a alcança.
Um percurso de três linhas e quatro colunas executa seu corpo interno doze vezes quando todas as posições são visitadas.
Laço do...while
Um laço do...while executa seu corpo antes de testar a condição, então sua primeira iteração ocorre mesmo que o teste falhe em seguida.
Um laço do...while de contagem de algarismos processa zero uma vez, contando-o como um número de um algarismo.
Laço for...in
Um laço for...in visita nomes de propriedades enumeráveis, o que o torna inadequado como laço comum para percorrer valores de vetores.
Em um vetor, ele fornece nomes de índices como cadeias de caracteres e também pode visitar propriedades adicionadas que não são elementos.
Laço for...of
Um laço for...of recebe em ordem cada valor fornecido por um iterável, sem exigir um contador numérico explícito.
for (const fruit of fruits) lê nomes de frutas diretamente para que o corpo possa processar cada nome.
Laço infinito
Um laço infinito continua se repetindo sem terminar porque sua execução nunca alcança uma saída efetiva.
Um contador que nunca muda pode fazer while (n < 3) imprimir o mesmo valor indefinidamente.
Laço while
Um laço while verifica sua condição antes de cada iteração e repete enquanto ela for avaliada como verdadeira, podendo executar zero vezes.
Um cálculo de crescimento usa while (balance < 1500) para repetir até que a meta seja alcançada.

M

Método entries
O método entries fornece pares de índice e valor para percorrer um vetor, permitindo ler as duas informações juntas.
for (const [i, name] of names.entries()) pode imprimir rótulos numerados usando i + 1.
Método every
O método every retorna verdadeiro quando nenhum elemento testado falha; ele para em uma falha e retorna verdadeiro para um vetor vazio.
Combine um teste de tamanho positivo com every quando um resultado de aprovação de todos precisar incluir pelo menos uma nota.
Método filter
O método filter retorna os elementos originais cujo teste da função de retorno é avaliado como verdadeiro, mantendo sua ordem original.
Um teste t => t > 20 seleciona medições de temperaturas quentes sem substituí-las por valores booleanos.
Método find
O método find retorna o primeiro elemento que passa no teste de uma função de retorno ou undefined quando nenhuma correspondência é encontrada.
Encontrar um número abaixo de um em [3, 0, 5] retorna zero, uma correspondência bem-sucedida, mas avaliada como falsa.
Método findIndex
O método findIndex retorna a primeira posição que passa no teste de uma função de retorno ou menos um quando nenhuma passa.
Uma posição encontrada pode ser usada para remoção após verificar que não é o valor de ausência de correspondência -1.
Método join
O método join produz uma cadeia de caracteres colocando um separador escolhido entre as formas de texto dos elementos de um vetor.
["2026", "03", "15"].join("-") produz a cadeia de data “2026-03-15”.
Método localeCompare
O método localeCompare informa a ordem relativa de textos segundo regras de configuração regional pelo sinal de seu resultado numérico.
Um resultado negativo de a.localeCompare(b, "en") coloca a antes de b nessa comparação.
Método map
O método map armazena resultados de uma função de retorno em um novo vetor com o mesmo tamanho do vetor de origem.
Transformar distâncias com km => km * 1000 constrói as medidas correspondentes em metros.
Método reduce
O método reduce carrega um acumulador pelas chamadas de uma função de retorno e retorna o resultado acumulado final.
Uma redução de soma iniciada em zero adiciona cada temperatura e retorna um único total numérico.
Método slice
O método slice retorna uma cópia superficial de um trecho sem alterar a origem, excluindo o índice final.
values.slice(1, 3) copia os valores dos índices um e dois para um novo vetor.
Método some
O método some retorna verdadeiro quando pelo menos um teste da função de retorno passa e para assim que esse sucesso é encontrado.
Verificar se alguma nota está abaixo de cinquenta retorna verdadeiro na primeira nota de reprovação.
Método splice
O método splice remove ou insere elementos no próprio vetor e retorna um vetor com os elementos removidos.
A chamada days.splice(2, 0, "Wed") insere um dia no índice dois sem remover um dia existente.
Método split
O método split cria um vetor de partes de texto dividindo uma cadeia de caracteres nas ocorrências de um separador especificado.
Dividir “4,8,15” pela vírgula produz três cadeias de caracteres que ainda precisam ser convertidas para uma soma numérica.
Métodos push e pop
Os métodos push e pop adicionam e removem elementos no fim de um vetor; push retorna o novo tamanho, enquanto pop retorna o elemento removido.
Uma lista pode adicionar um nome ao fim com push e depois remover esse último nome com pop.
Métodos shift e unshift
Os métodos shift e unshift removem e adicionam elementos no início de um vetor, alterando os índices dos elementos que permanecem.
Usar queue.shift() remove o primeiro nome da espera e move o próximo nome para o índice zero.
Mutação
A mutação altera o conteúdo ou a ordem de um vetor existente, tornando a alteração visível por todas as referências a esse vetor.
Chamar scores.push(95) altera scores mesmo quando a variável foi declarada com const.

O

Ordem crescente
A ordem crescente coloca valores do menor para o maior segundo a comparação escolhida, como um comparador numérico por subtração.
Ordenar [10, 9, 1] numericamente em ordem crescente produz [1, 9, 10].
Ordenação estável
Uma ordenação estável preserva a ordem relativa original dos elementos que a função de comparação trata como iguais.
Palavras de mesmo comprimento mantêm sua ordem anterior quando ordenadas usando apenas uma comparação de comprimento.
Ordenação no próprio vetor
Uma ordenação no próprio vetor altera a ordem no vetor existente e retorna esse mesmo vetor em vez de criar um independente.
Após const ordered = scores.sort(...), ordered e scores referem-se ao mesmo vetor.

P

Parâmetro
Um parâmetro é uma entrada nomeada na definição de uma função; sua posição determina qual argumento fornecido ele recebe.
Em uma função de retorno de map (value, i), o segundo parâmetro recebe o índice do elemento atual.
Parâmetro rest
Um parâmetro rest reúne os argumentos restantes fornecidos a uma função em um vetor; o espalhamento em uma chamada expande valores no sentido oposto.
Em function total(...nums), nums reúne os argumentos separados em um vetor.
Percurso por índices
Um percurso por índices visita um vetor por posições numéricas, permitindo controlar a direção, o tamanho do passo e o acesso a vizinhos.
Um percurso de trás para frente começa em arr.length - 1 e diminui o índice enquanto ele for pelo menos zero.
Posição vazia
Uma posição vazia é uma lacuna indexada sem elemento armazenado; ela contribui para o tamanho do vetor e é lida como undefined.
new Array(3) cria três posições vazias, enquanto [3] cria um elemento armazenado explicitamente.
Predicado
Um predicado é uma função usada como teste; seu resultado decide se um elemento corresponde a uma condição ou deve ser mantido.
O predicado n => n !== null preserva medições válidas iguais a zero enquanto rejeita medições nulas.

R

Referência
Uma referência identifica um vetor compartilhado para que várias variáveis possam acessar o mesmo conteúdo sem que cada uma tenha uma cópia separada.
Após const b = a, chamar b.push(4) também altera o vetor lido por meio de a.
Rótulo de laço
Um rótulo de laço nomeia um laço para que um break ou continue com rótulo direcione o controle a esse laço envolvente.
Escrever break outer; em uma correspondência pode encerrar ambos os laços quando o laço externo tem o rótulo outer.

S

Sintaxe de espalhamento
A sintaxe de espalhamento expande os valores de um iterável em um literal de vetor ou em argumentos separados em uma chamada de função.
A expressão [...first, ...second] coloca os valores de ambos os vetores em um novo vetor externo.

T

Tabela de rastreamento
Uma tabela de rastreamento registra valores que mudam em etapas sucessivas de execução para que o comportamento de um laço possa ser acompanhado e verificado.
Colunas para a medição atual e a soma acumulada mostram exatamente em qual iteração um total errado aparece pela primeira vez.
Tamanho do vetor
O tamanho do vetor é o número de posições indexadas até seu limite final, incluindo lacunas entre elementos aos quais foram atribuídos valores.
Atribuir um valor ao índice 4 em um vetor menor faz seu tamanho ser pelo menos cinco, mesmo que posições anteriores estejam vazias.
Teste de pertinência
Um teste de pertinência pergunta se um valor ocorre em uma coleção e informa um booleano em vez de uma posição correspondente.
drinks.includes("tea") responde se essa cadeia exata em minúsculas está presente no vetor.

V

Valor de retorno
Um valor de retorno é o resultado que uma função envia a quem a chamou; um corpo em bloco sem instrução de retorno produz undefined.
Uma função de retorno de map com { n * 2; } calcula um produto, mas não o retorna para armazenamento.
Valor inicial
Um valor inicial fornece a reduce seu acumulador inicial e é retornado sem alteração quando a entrada não tem elementos a processar.
Fornecer 0 faz uma redução de soma vazia retornar zero em vez de lançar um TypeError.
Vetor
Um vetor é uma coleção ordenada de valores com posições indexadas, armazenada e acessada por meio de uma única referência.
O vetor [18, 21, 19, 24] contém quatro medições diárias de temperatura sob um nome de variável.
Vetor aninhado
Um vetor aninhado é um vetor armazenado como elemento dentro de outro vetor, permitindo estruturas como linhas de valores.
Em grid[1][0], o primeiro índice seleciona uma linha e o segundo seleciona um valor dentro dessa linha.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar