Variáveis e tipos em JavaScript: primeiros passos

Dê seus primeiros passos em JavaScript, a linguagem que torna as páginas web interativas. Conecte scripts a uma página HTML, armazene valores com let e const e faça cálculos com números, cadeias de caracteres e booleanos. Aprenda como JavaScript converte tipos para que resultados como "5" + 2 produzir "52" deixem de surpreender. Tome decisões com comparações, operadores lógicos, if/else e switch e encontre e corrija erros com o console e o depurador do navegador.

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

O que você vai aprender

  1. Conecte JavaScript a uma página HTML, controle quando o código é executado e use o console do navegador para executar código e ver sua saída.
    • Adicionar JavaScript a uma página HTML
      Vincule scripts com o elemento <script>, incorporados ao HTML ou em um arquivo separado, e escolha onde colocá-los e como carregá-los.
    • Escrever instruções e usar o console
      Escreva instruções e comentários, execute código no console do navegador e mostre a saída com console.log e as caixas de diálogo nativas do navegador.
  2. Declare variáveis com nomes claros, decida entre let e const e preveja onde cada variável pode ser usada.
    • Declarar e nomear variáveis
      Crie variáveis com let e const, dê a elas nomes válidos e legíveis e atualize aquelas que mudam.
    • Prever o escopo e os erros sinalizados por let e const
      Preveja em que parte do código uma variável pode ser usada e reconheça e corrija os erros produzidos por let e const.
  3. Reconheça os tipos de dados de JavaScript, faça cálculos corretamente com números e construa e altere textos com cadeias de caracteres e literais de modelo.
    • Reconhecer tipos de dados com typeof
      Nomeie os tipos de dados de JavaScript, diferencie null de undefined e verifique o tipo de qualquer valor com typeof.
    • Calcular com números e operadores aritméticos
      Use os operadores aritméticos e de atribuição, aplique a precedência dos operadores, arredonde resultados e reconheça os limites do ponto flutuante e os valores numéricos especiais.
    • Criar e alterar cadeias de caracteres
      Escreva literais de cadeias de caracteres, inclua aspas e caracteres especiais e use o tamanho, as posições de índice e os métodos comuns das cadeias.
    • Construir textos com literais de modelo
      Insira valores e expressões em texto com cadeias de caracteres entre crases, escreva texto em várias linhas e formate números dentro de mensagens.
  4. Converta valores explicitamente com Number(), String() e Boolean() e preveja as conversões automáticas que JavaScript faz em operadores e condições.
    • Converter valores explicitamente
      Converta texto em números e outros valores em cadeias de caracteres ou booleanos e verifique se uma conversão funcionou.
    • Prever a coerção automática de tipos
      Preveja os resultados de operadores aplicados a tipos diferentes e use deliberadamente valores avaliados como verdadeiros e falsos.
  5. Compare valores corretamente, combine condições com operadores lógicos e escolha qual código será executado com if, else, o operador condicional e switch.
    • Comparar valores
      Use os operadores de comparação para produzir true ou false e preveja comparações de cadeias de caracteres, tipos diferentes, null, NaN e decimais.
    • Combinar condições com operadores lógicos
      Una e inverta condições com &&, || e !, use a avaliação de curto-circuito e forneça valores padrão com || e ??.
    • Escolher caminhos de execução com if, else, o operador condicional e switch
      Escreva cadeias de if, else if e else, escolha valores com o operador condicional e trate casos fixos com switch.
  6. Leia mensagens de erro, rastreie valores com a saída do console e pause o código no depurador do navegador para ver exatamente o que ele faz.
    • Ler mensagens de erro e rastrear valores com o console
      Distinga erros de sintaxe, de execução e de lógica, leia o que uma mensagem de erro informa e use valores exibidos para encontrar onde um resultado dá errado.
    • Pausar e executar o código passo a passo com o depurador
      Defina pontos de interrupção, execute o código linha por linha e inspecione os valores das variáveis enquanto o código estiver pausado.

Guia de estudo de Variáveis e tipos em JavaScript

6 capítulos

1

Executar um script e ver sua saída

Um navegador pode executar um cálculo assim que você carrega uma página, mas o código precisa de um lugar para ficar e de uma forma de mostrar seu resultado. Conecte um script ao HTML, escolha quando ele é executado e use o console para ver suas mensagens. Pequenos experimentos no console ajudarão você a aprender a linguagem antes de alterar elementos da página. Você também verá a diferença entre o valor de uma expressão e uma mensagem exibida por um programa.

1.1 Conectar JavaScript ao HTML

O HTML dá estrutura a uma página, o CSS controla sua aparência e o JavaScript acrescenta comportamento. O motor JavaScript de um navegador executa as instruções de um script. A menos que uma decisão altere o caminho, essas instruções são executadas de cima para baixo.

Coloque o código na página ou em um arquivo separado

Um script incorporado ao HTML contém JavaScript entre as tags de abertura e fechamento:

<script>
  console.log("Hello from the page");
</script>

Um script externo mantém o JavaScript em um arquivo .js separado. Este HTML o carrega:

<script src="js/app.js"></script>

O arquivo externo contém console.log("Hello from the page"); sem tags <script>. Separar os arquivos mantém o HTML legível, permite que várias páginas compartilhem código e permite que o navegador mantenha o script em cache. Quando src está presente, o código dentro do mesmo elemento é ignorado. Use uma abordagem por elemento e sempre escreva a tag de fechamento </script>: uma tag de fechamento automático <script ... /> não fecha o elemento em HTML.

Escolha quando o script é executado

Um script clássico sem atributo de carregamento interrompe a análise do HTML enquanto o navegador o carrega e executa. Em <head>, ele é executado antes que o conteúdo posterior de body tenha sido construído. Colocá-lo imediatamente antes de </body> deixa o conteúdo da página à frente dele.

Para um script clássico externo em <head>, defer é uma opção padrão útil:

<script src="js/app.js" defer></script>

O navegador baixa o script enquanto continua a analisar o HTML. Ele executa o script após o término da análise. Vários scripts com execução adiada são executados na ordem do HTML, portanto um segundo script pode usar valores definidos pelo primeiro.

Opção de carregamentoQuando o script é executadoOrdem de vários scripts
Clássico, sem atributoQuando a análise chega até ele, após o carregamentoOrdem do HTML
deferApós a análise do HTMLOrdem do HTML
asyncAssim que seu download terminaOrdem de conclusão dos downloads

Use async para código independente que não dependa de a página estar pronta nem de outro script. Adicionar defer a um script clássico incorporado ao HTML não tem efeito.

Carregue um módulo
<script type="module" src="js/main.js"></script>

A execução de um módulo é adiada por padrão e ele é executado em modo estrito. Ele pode compartilhar código por meio de import e export. Para carregar módulos no Chrome ou no Firefox, sirva o projeto com um servidor de desenvolvimento local, como o recurso live-server de um editor. Abrir a página em um endereço file:// causa restrições ao carregamento de módulos.

Verifique a conexão

Suponha que index.html esteja ao lado de uma pasta js que contém greet.js. Coloque console.log("Page ready"); nesse script e <script src="js/greet.js" defer></script> no head do HTML. Abra a página e depois seu console: a mensagem é “Page ready”.

O caminho relativo começa na pasta do arquivo HTML. Com essa organização, src="greet.js" aponta para o lugar errado. Uma mensagem de arquivo não encontrado significa que não há script para executar naquele endereço. Se você copiou as tags HTML para o arquivo JavaScript, o motor informa um erro de sintaxe na marcação.

Principais conclusões

  • Um script externo usa src; seu arquivo JavaScript contém código sem tags HTML.
  • Um caminho relativo de script começa na pasta do arquivo HTML.
  • Um script clássico externo com execução adiada é executado após a análise; scripts com execução adiada mantêm a ordem do HTML.
  • Um script async é executado assim que está pronto, portanto scripts dependentes precisam de outra opção de carregamento.
  • Módulos têm execução adiada por padrão e usam modo estrito.
  • Um elemento de script precisa de uma tag de fechamento </script>.

1.2 Escrever instruções e inspecionar o console

O console do navegador mostra mensagens, erros e os resultados do código que você digita. Abra o console da página que você está testando. No Chrome ou no Edge, use Ctrl+Shift+J no Windows/Linux ou Cmd+Option+J no Mac. No Firefox, use Ctrl+Shift+K ou Cmd+Option+K. F12 abre as ferramentas de desenvolvimento como um todo no Chrome e no Edge.

Instruções e expressões

Uma expressão produz um valor: 4 + 5 produz 9. Uma instrução dá um comando, como armazenar esse valor ou exibi-lo:

let total = 4 + 5;
console.log("Total:", total);

A primeira linha é executada antes da segunda, que exibe “Total: 9”. Um ponto e vírgula encerra uma instrução. JavaScript pode inserir muitos pontos e vírgulas omitidos, mas quebras de linha nem sempre funcionam como separadores. Encerre as instruções com ponto e vírgula para deixar clara a estrutura pretendida.

Digite 2 + 3 no console e pressione Enter para ver 5. Use Shift+Enter para iniciar uma nova linha sem executar a entrada. Se você inserir let x = 5;, o console poderá exibir undefined como resultado dessa instrução. Isso não significa que x contém undefined: inserir x em seguida mostra 5. Da mesma forma, uma chamada a console.log() exibe sua mensagem e retorna undefined.

Nomes e comentários

JavaScript distingue maiúsculas de minúsculas. console.log("Hi"); funciona, mas Console.log("Hi"); refere-se a um nome diferente e lança ReferenceError. console.Log("Hi"); encontra console, mas falha com TypeError porque não há um método Log que possa ser chamado.

Comentários são para quem lê o código. O motor os ignora:

// Keep the starting value for the next calculation.
let total = 4;
/* A comment can also
   continue on another line. */
console.log(total);

Colocar // antes de uma instrução desativa temporariamente essa linha. Um comentário útil explica um motivo que o código sozinho não deixa claro.

Mensagens, avisos e experimentos

console.log("Total:", 9); exibe seus argumentos separados por espaços. console.warn() marca um aviso; console.error() marca uma mensagem de erro. Exibir uma mensagem com console.error() não lança uma exceção por si só. console.clear() limpa a exibição.

Entradas no console são experimentos, não edições salvas. Recarregar a página executa os scripts salvos novamente. Você pode inspecionar no console variáveis de nível superior de scripts clássicos; as variáveis de nível superior de um módulo permanecem dentro desse módulo.

Caixas de diálogo simples e modo estrito

alert("Saved!"); mostra uma mensagem. confirm("Continue?") retorna true para OK e false para Cancelar. prompt("Quantity?", "1") retorna a cadeia de caracteres digitada ou null para Cancelar. Digitar 12 produz "12", não 12. Essas caixas de diálogo pausam a interação enquanto estão abertas.

Coloque "use strict"; no início de um script clássico para que certos erros sejam sinalizados. Por exemplo, totl = 5; sem declaração lança ReferenceError no modo estrito; em um script clássico sem modo estrito, pode criar uma variável global acidental. Um módulo já usa modo estrito. Verifique a grafia e declare os nomes antes de atribuir valores a eles.

Principais conclusões

  • A entrada no console avalia expressões, e console.log() exibe mensagens.
  • O undefined exibido para uma declaração é diferente do valor armazenado em sua variável.
  • Nomes distinguem maiúsculas de minúsculas; comentários são ignorados durante a execução.
  • prompt() retorna texto ou null, e confirm() retorna um booleano.
  • O modo estrito sinaliza atribuições a nomes não declarados como erros.
2

Armazenar valores e controlar onde os nomes funcionam

Variáveis dão nomes a valores que o restante do programa pode usar. Escolher const ou let informa a quem lê se um nome receberá uma reatribuição. O lugar onde você declara uma variável também importa: um valor criado dentro de um bloco pode não estar disponível fora dele. Acompanhe um pequeno total acumulado e depois rastreie blocos aninhados para ver a qual variável cada nome se refere e por que erros de declaração produzem mensagens diferentes.

2.1 Declarar, atribuir e atualizar valores

Uma variável é um nome que se refere a um valor. Você pode declarar o nome primeiro e atribuir seu valor depois ou fazer ambos em uma instrução. O operador de atribuição = armazena o valor à direita no nome à esquerda.

Escolha let ou const
let score;
console.log(score); // undefined
score = 10;
score = score + 2;
console.log(score); // 12

let score; declara a variável. Até que uma atribuição lhe dê outro valor, ela contém undefined. A próxima atribuição armazena 10. Em score = score + 2;, JavaScript lê a pontuação antiga, adiciona 2 e depois armazena 12. Essa é uma instrução de atualização, portanto não precisa fazer sentido como equação matemática. A reatribuição usa o nome existente sem escrever let novamente.

Uma declaração const deve incluir seu valor inicial:

const BOILING_POINT_C = 100;

A declaração const rate; é um erro de sintaxe porque não tem um inicializador. Tentar atribuir um novo valor a BOILING_POINT_C depois lança um TypeError.

DeclaraçãoPrecisa de um valor inicial?O nome pode receber uma reatribuição?
letNãoSim
constSimNão

Use const por padrão. Escolha let para um total acumulado, um contador ou um resultado ao qual instruções posteriores atribuirão um valor. Um valor calculado a partir de outros valores ainda pode usar const se o programa nunca reatribuir esse nome.

Dê ao nome um significado claro

Nomes podem conter letras, dígitos, _ e $; não podem começar com um dígito. place1 é válido, mas 1stPlace não é. Espaços são proibidos, e um hífen é lido como subtração, portanto total-price não nomeia uma única variável. Palavras reservadas como if, return e class não podem ser nomes de variáveis.

Use notação camelCase para nomes comuns: itemCount, firstName ou priceWithTax. Nomes booleanos como isLoggedIn e hasDiscount descrevem um valor de sim ou não. Inclua unidades quando evitarem confusão: distanceKm e durationMin. Valores fixos conhecidos antes da execução do programa muitas vezes usam UPPER_SNAKE_CASE, como MAX_LOGIN_ATTEMPTS. Maiúsculas e minúsculas importam: total e Total são nomes distintos.

Acompanhe um total acumulado
const TAX_RATE = 0.2;
let total = 0;
total = total + 12.5;
total = total + 7.5;
const totalWithTax = total * (1 + TAX_RATE);
console.log(totalWithTax); // 24

O total começa em 0, passa a 12.5 e depois a 20. O multiplicador 1 + TAX_RATE é 1.2, portanto o valor final é 24. Apenas total precisa receber reatribuições. A taxa de imposto e o valor final calculado usam const.

Se você escrever let total = 7.5; uma segunda vez no mesmo escopo, estará tentando declarar uma segunda variável, não atualizar a primeira. Use total = 7.5; para substituir o valor.

Reconheça declarações antigas

Código antigo muitas vezes usa var. Ele ainda funciona, mas suas variáveis pertencem a uma função ou a um script em vez de um bloco aninhado comum. Ele permite declarações repetidas, e leituras antes da declaração produzem undefined. As versões modernas let e const detectam esses erros. Lembre-se de suas regras ao ler um tutorial antigo que usa var.

Principais conclusões

  • = calcula o lado direito e depois armazena seu valor no nome à esquerda.
  • Use const por padrão e let quando o código reatribuir o nome.
  • Uma declaração const exige um valor inicial.
  • Reatribua uma variável existente sem repetir sua palavra-chave de declaração.
  • Nomes descritivos em camelCase podem mostrar significado e unidades.

2.2 Acompanhar o escopo e diagnosticar erros de declaração

Um bloco é o código entre chaves, como o corpo de um if. O escopo de uma variável é a região em que seu nome se refere a essa variável. Tanto let quanto const têm escopo de bloco, incluindo quaisquer blocos aninhados dentro do bloco em que são declarados.

Mantenha um resultado onde ele é necessário
const temperatureC = 31;
let label;
if (temperatureC > 30) {
  label = "hot";
} else {
  label = "mild";
}
console.log(label); // hot

label é declarada fora dos ramos, portanto a linha final pode lê-la. Cada ramo atribui um valor à variável existente. Se, em vez disso, você declarar const label = "hot"; dentro do primeiro ramo, essa variável não poderá ser lida após o bloco. Sem outra label no escopo, a leitura final lança ReferenceError.

Uma declaração no nível superior de um script clássico tem escopo global: o código posterior nesse script e os outros scripts clássicos da página podem usá-la. Em um módulo, variáveis de nível superior pertencem a esse módulo. Mantenha uma variável no menor escopo que precisa dela para reduzir conflitos de nomes.

Distinga sombreamento de reatribuição
let x = 1;
{
  let x = 2;
  console.log(x); // 2
}
console.log(x); // 1

A declaração interna cria uma variável separada. Isso é sombreamento: dentro do bloco interno, x refere-se à variável interna. A variável externa permanece 1. Retirar o let interno atribuiria 2 à variável externa. Nomes distintos tornam essa diferença mais fácil de perceber.

Leitura antes da inicialização

Uma vinculação com escopo de bloco abrange todo o seu bloco, mas não pode ser acessada antes que a declaração a inicialize. A região antes da inicialização é a zona morta temporal:

console.log(price);
let price = 5;

Isso lança ReferenceError: Cannot access 'price' before initialization. O nome existe no escopo, mas não está pronto. Em comparação, price is not defined significa que nenhuma vinculação com esse nome pode ser encontrada ali. Uma declaração interna também sombreia um nome externo antes da linha da declaração interna; o valor externo não pode contornar a zona morta temporal da variável interna.

Relacione cada erro a uma correção
ProblemaTipo de erroCorreção
const rate;SyntaxErrorForneça um valor inicial
Um segundo let total em um escopoSyntaxErrorAtribua sem outro let
Leitura antes da inicializaçãoReferenceErrorInicialize antes da leitura
Leitura de um nome desconhecido ou fora do escopoReferenceErrorCorrija o nome ou mova sua declaração
Reatribuição de uma constTypeErrorUse let se a reatribuição for necessária

Erros de sintaxe impedem que esse script comece. Um erro em tempo de execução interrompe a execução atual quando ela chega à instrução que falha. O Chrome permite outra declaração let em uma entrada separada do console por conveniência; isso não torna válidas declarações duplicadas em um script.

Const fixa a referência

Valores primitivos como números e cadeias de caracteres não podem ser alterados no próprio valor. O conteúdo de um objeto pode mudar mesmo quando seu nome usa const:

const settings = { theme: "dark" };
settings.theme = "light"; // allowed

O nome ainda se refere ao mesmo objeto. Atribuir settings = {}; tenta substituir essa referência e lança TypeError.

Principais conclusões

  • Nomes declarados com let e const têm como escopo o bloco que os contém.
  • Declare um resultado compartilhado antes dos ramos que atribuem um valor a ele.
  • O sombreamento cria uma variável separada; a reatribuição altera a variável existente.
  • Uma leitura na zona morta temporal falha mesmo que a vinculação exista nesse escopo.
  • Declarações duplicadas são erros de sintaxe, enquanto a reatribuição de uma const é um TypeError em tempo de execução.
  • Um objeto em uma const pode ter seu conteúdo alterado sem reatribuir o nome.
3

Calcular com valores e construir textos

O tipo de um valor ajuda a explicar o que uma operação fará. Números permitem cálculos, cadeias de caracteres armazenam texto e booleanos armazenam true ou false. Aprenda a inspecionar esses tipos, controlar a ordem das operações aritméticas e armazenar os resultados de métodos de cadeias de caracteres. Os literais de modelo permitem combinar valores em mensagens legíveis. A saída exata do console mostrará onde texto, números, arredondamento e formatação se comportam de modo diferente.

3.1 Identificar o tipo de um valor

Os valores 7, "7" e true têm tipos diferentes. Eles podem aparecer em lugares semelhantes em uma página, mas JavaScript aplica regras diferentes a cada um. Um tipo descreve o valor armazenado no momento, não uma restrição permanente da variável.

Comece pelos três tipos principais

Um número representa valores numéricos inteiros e decimais: 42, -7 e 3.75 têm o mesmo tipo. A notação científica também é numérica: 1e3 significa 1000. Uma cadeia de caracteres armazena texto entre aspas, portanto "42" é texto, embora seus caracteres sejam dígitos. Um booleano é exatamente true ou false, sem aspas. Comparações produzem booleanos que um programa pode usar para tomar decisões.

Use typeof para inspecionar um valor. Ele retorna uma cadeia de caracteres com o nome do tipo:

console.log(typeof 7);         // number
console.log(typeof "7");       // string
console.log(typeof true);      // boolean
console.log(typeof undefined); // undefined

Os comentários mostram as palavras exibidas; os próprios resultados são cadeias de caracteres como "number".

Reconheça valores ausentes
let city;
let middleName = null;
console.log(city);       // undefined
console.log(middleName); // null

undefined geralmente significa que JavaScript não recebeu um valor, como ocorre com um let não inicializado. null geralmente é atribuído de propósito para significar “vazio” ou “sem valor”. Teste um valor intencionalmente vazio com middleName === null.

Não use typeof value === "object" para testar null. typeof null produz "object" por causa de um comportamento histórico da linguagem, embora null seja um valor primitivo.

Conheça a lista completa de tipos

JavaScript tem sete tipos primitivos: number, string, boolean, undefined, null, bigint e symbol. O oitavo tipo é object, usado para valores estruturados. Funções são objetos que podem ser chamados, embora typeof informe "function" para elas.

Um bigint é um número inteiro escrito com um n no final, como 9007199254740993n. Ele permite representar números inteiros grandes com exatidão. Não misture um bigint e um number em operações aritméticas: 1n + 2 lança TypeError. Um symbol é um identificador único; typeof Symbol("id") produz "symbol". typeof 42n produz "bigint".

NaN é outro resultado especial a reconhecer: apesar de seu nome, “não é um número”, typeof NaN é "number". Ele é um valor numérico que indica um resultado numérico inválido. Seu nome, por si só, não identifica um tipo separado.

Rastreie uma variável que muda
let data = 42;
console.log(typeof data); // number
data = "forty-two";
console.log(typeof data); // string

Isso é tipagem dinâmica. A reatribuição pode substituir um número por uma cadeia de caracteres. Essa flexibilidade torna útil exibir tanto o valor quanto seu tipo quando um resultado surpreende:

const input = "7";
console.log(input, typeof input); // 7 string
console.log(input + 1);           // 71
console.log(7 + 1);               // 8

A primeira adição concatena texto; a segunda soma números. Valores primitivos não podem ser alterados no próprio valor: uma operação cria um novo valor. Atualizar uma variável altera o valor ao qual ela se refere.

Principais conclusões

  • Valores têm tipos; uma variável let pode armazenar tipos diferentes após uma reatribuição.
  • typeof retorna uma cadeia de caracteres com o nome do tipo de um valor.
  • undefined frequentemente significa que nenhum valor foi atribuído; null geralmente indica uma ausência intencional.
  • typeof null é "object", e typeof NaN é "number".

3.2 Controlar operações aritméticas e resultados numéricos

JavaScript usa um tipo numérico comum para valores inteiros e decimais. A divisão mantém a parte fracionária: 10 / 4 produz 2.5. Tanto o operador escolhido quanto a ordem em que ele é executado afetam o resultado.

Calcule na ordem pretendida
OperadorSignificadoExemplo
+, -Adição, subtração8 - 3 produz 5
*, /Multiplicação, divisão7 / 2 produz 3.5
%Resto da divisão17 % 5 produz 2
**Exponenciação2 ** 3 produz 8

Potências são calculadas antes de multiplicação, divisão e resto; essas operações são calculadas antes de adição e subtração. Operadores de mesmo nível são executados da esquerda para a direita, exceto potências, que se associam da direita para a esquerda: 2 ** 3 ** 2 é 2 ** 9, ou 512. Parênteses alteram essa ordem: 2 + 3 * 4 produz 14, mas (2 + 3) * 4 produz 20.

Para calcular a média de 72, 85 e 90, some todo o grupo antes de dividir:

const average = (72 + 85 + 90) / 3;
console.log(average); // 82.33333333333333

Sem parênteses, 72 + 85 + 90 / 3 divide apenas 90 e produz 187.

Separe unidades inteiras e restos

Math.trunc(7 / 2) descarta a parte fracionária e produz 3. Para um comprimento positivo de 245 cm, Math.floor(245 / 100) produz 2 metros, e 245 % 100 produz os 45 centímetros restantes. Da mesma forma, 3725 segundos produzem 1 hora com Math.floor(3725 / 3600), 2 minutos com Math.floor((3725 % 3600) / 60) e 5 segundos com 3725 % 60. Para um inteiro, n % 2 === 0 testa se ele é par. Um resto tem o sinal do operando à esquerda: -7 % 3 produz -1.

Atualize um número

x += 5 significa x = x + 5. Os operadores -=, *=, /=, %= e **= seguem o mesmo padrão. Começando em 10, as atualizações += 5, *= 2, -= 4 e depois /= 2 produzem 15, 30, 26 e depois 13.

++ aumenta em uma unidade e -- diminui em uma unidade. Com let a = 5; let b = a++;, a passa a 6, mas b recebe 5: o incremento pós-fixado retorna o valor antigo. Com let b = ++a;, começando novamente com a = 5, ambos passam a 6. Uma atualização em sua própria linha evita depender desse resultado da expressão.

Arredonde e formate de modo intencional
FerramentaRegra do resultadoExemplo
Math.round()Inteiro mais próximo; metades em direção ao infinito positivoMath.round(-2.5) produz -2
Math.floor()Para baixo, em direção ao infinito negativoMath.floor(-2.5) produz -3
Math.ceil()Para cima, em direção ao infinito positivoMath.ceil(2.1) produz 3
Math.trunc()Descarta a parte fracionária em direção a zeroMath.trunc(-2.7) produz -2

Math.round(13.456 * 100) / 100 produz o número 13.46. Já (3.14159).toFixed(2) produz a cadeia de caracteres "3.14", e (19.999).toFixed(2) produz "20.00". Formate no final: adicionar um número a uma cadeia formatada concatena texto.

Reconheça limites numéricos

Números usam ponto flutuante binário de 64 bits. A maioria das frações decimais é aproximada, portanto 0.1 + 0.2 é 0.30000000000000004. Arredonde para exibição, compare com uma pequena tolerância adequada ou calcule em unidades inteiras, como centavos ou milímetros.

Algumas operações inválidas retornam um valor em vez de lançar um erro: 5 / 0 é Infinity, -5 / 0 é -Infinity, e 0 / 0 ou "abc" * 2 é NaN. A maioria das operações aritméticas com NaN continua produzindo NaN; NaN ** 0 é uma exceção e produz 1.

Todo inteiro até Number.MAX_SAFE_INTEGER, 9007199254740991, é exato. Além dele, apenas alguns inteiros podem ser representados: 9007199254740992 + 1 ainda produz 9007199254740992. Bigints permitem representar inteiros exatos maiores.

Principais conclusões

  • Parênteses podem fazer com que uma soma inteira seja a entrada de uma divisão.
  • % produz um resto; a divisão sozinha mantém a parte fracionária.
  • O incremento pós-fixado retorna o valor antigo; o incremento prefixado retorna o novo.
  • Floor, ceil, round e trunc diferem para valores negativos.
  • toFixed() produz texto para exibição.
  • Operações aritméticas decimais podem ser aproximadas, mesmo com entradas aparentemente simples.
  • NaN e os infinitos são valores especiais do tipo number.

3.3 Ler, pesquisar e transformar texto

Uma cadeia de caracteres armazena texto entre aspas simples, aspas duplas ou crases correspondentes. Para texto simples, as três formas podem representar o mesmo valor. As aspas marcam onde o texto começa e termina; elas não fazem parte desse valor.

Aspas, sequências de escape e concatenação

Use o outro estilo de aspas para incluir uma aspa: "It's late". Uma sequência de escape usa uma barra invertida, como em 'It\'s late'. \n representa uma quebra de linha, \t uma tabulação e \\ uma barra invertida. A sequência \n ocupa uma posição na cadeia de caracteres, embora sejam necessários dois símbolos digitados para escrevê-la. "It's".length é 4; "Line 1\nLine 2".length é 13.

O operador + concatena cadeias de caracteres. "Hello" + " " + "world" produz "Hello world"; nenhum espaço é inserido a menos que um dos trechos o contenha. Com let msg = "Hi"; msg += " there";, o valor atualizado é "Hi there".

As posições começam em zero
const language = "JavaScript";
console.log(language.length); // 10
console.log(language[0]);     // J
console.log(language[4]);     // S
console.log(language[9]);     // t
console.log(language.at(-1)); // t
console.log(language[10]);    // undefined

O índice final é length - 1. Um argumento negativo em at() conta a partir do final. length é uma propriedade, não um método: language.length() lança TypeError. Mais precisamente, as posições e o length das cadeias de caracteres usam unidades de código UTF-16, as unidades que JavaScript usa para armazenar texto. Cada uma dessas letras comuns do inglês ocupa uma unidade; alguns símbolos e emojis ocupam mais.

Salve a nova cadeia de caracteres

Cadeias de caracteres são imutáveis: seu conteúdo não pode ser editado no próprio valor. Atribuir word[0] = "b" quando word é "cat" não cria "bat"; no modo estrito, isso lança um erro. Métodos que transformam texto retornam uma nova cadeia:

let name = "ana";
name.toUpperCase();
console.log(name); // ana
name = name.toUpperCase();
console.log(name); // ANA

Chamar o método não basta para manter seu resultado. Escrever name.toUpperCase sem parênteses sequer o chama.

Escolha a operação de texto adequada

toLowerCase() e toUpperCase() alteram as letras para minúsculas ou maiúsculas; trim() remove espaços em branco nas duas extremidades. O encadeamento aplica cada método ao resultado anterior: " Ana@Example.com ".trim().toLowerCase() produz "ana@example.com".

includes(), startsWith() e endsWith() retornam booleanos. Por exemplo, "report.pdf".endsWith(".pdf") produz true. indexOf() produz a primeira posição correspondente ou -1: "JavaScript".indexOf("S") produz 4, mas procurar "s" produz -1. As buscas distinguem maiúsculas de minúsculas. "JavaScript".includes("script") é false; converta para minúsculas antes dessa busca para obter true.

slice(start, end) retorna o texto do índice inicial até o índice final, sem incluí-lo. "JavaScript".slice(0, 4) produz "Java"; .slice(4) e .slice(-6) produzem "Script".

"a-b-c".replace("-", "+") produz "a+b-c"; replaceAll() com os mesmos argumentos produz "a+b+c". "ab".repeat(3) produz "ababab", e "5".padStart(3, "0") produz "005". Para const city = "paris";, city[0].toUpperCase() + city.slice(1) produz "Paris" ao unir uma primeira letra maiúscula ao restante inalterado.

Principais conclusões

  • Cadeias de caracteres precisam de aspas correspondentes, e a concatenação não adiciona espaços por si só.
  • O primeiro índice é zero e o índice da última letra comum é length - 1.
  • length é uma propriedade; métodos são chamados com parênteses.
  • Métodos de transformação produzem novas cadeias de caracteres, portanto salve seus resultados.
  • Buscas em cadeias de caracteres distinguem maiúsculas de minúsculas.
  • slice() exclui seu índice final.

3.4 Inserir valores em mensagens legíveis

Um literal de modelo coloca texto entre crases. Dentro dele, ${...} marca um marcador de posição cuja expressão será avaliada e inserida no texto. Isso é útil quando uma mensagem combina vários valores com pontuação, espaços ou cálculos.

Leia um marcador de posição como uma expressão
const name = "Ana";
const greeting = `Hello, ${name}!`;
console.log(greeting); // Hello, Ana!

O motor lê name, obtém "Ana" e o coloca entre a saudação e o ponto de exclamação. As crases e os símbolos do marcador de posição descrevem a cadeia de caracteres; eles não aparecem na mensagem resultante.

Com concatenação, a mesma ideia é "Hello, " + name + "!". Uma mensagem mais longa como "Hello, " + name + "! You have " + count + " new messages." exige vários trechos entre aspas separadas. Um modelo mantém a frase inteira unida: `Hello, ${name}! You have ${count} new messages.`. Os espaços ainda precisam ser digitados onde você os deseja.

Calcule e depois formate dentro do marcador
const name = "Ana";
const tickets = 3;
const price = 4.5;
const receipt = `${name} bought ${tickets} tickets for ${(tickets * price).toFixed(2)} in total.`;
console.log(receipt);

A saída é “Ana bought 3 tickets for 13.50 in total.” Primeiro, tickets * price produz 13.5. Os parênteses tornam todo esse produto o receptor de .toFixed(2), que produz "13.50". O marcador de posição insere esse texto na frase. As variáveis numéricas price e tickets permanecem inalteradas.

Sem formatação, um marcador de posição mostra a forma textual comum do número. `${0.1 + 0.2}` produz "0.30000000000000004". Formatando-o dentro do marcador, `${(0.1 + 0.2).toFixed(2)}` produz "0.30".

Expressões são permitidas; instruções não

Um marcador de posição pode conter um valor, um cálculo, uma chamada de método ou uma expressão que escolhe um valor. Com birthYear = 1990, `You turn ${2026 - birthYear} this year.` produz “You turn 36 this year.”

O operador condicional pode selecionar texto no singular ou no plural:

const count = 1;
console.log(`You have ${count} ${count === 1 ? "item" : "items"}`);
// You have 1 item

A comparação escolhe uma cadeia de caracteres para inserir. Uma instrução if não pode substituir essa expressão dentro de ${...} porque um marcador de posição precisa de uma expressão que produza um valor.

Mantenha a pontuação exata

Somente crases ativam marcadores de posição. Com const n = 5;, "n + 1 = ${n + 1}" é texto comum e deixa ${n + 1} inalterado. O modelo `n + 1 = ${n + 1}` produz “n + 1 = 6”. Uma crase é um caractere diferente de uma aspa simples.

Quebras de linha digitadas entre crases tornam-se quebras de linha na cadeia de caracteres resultante. Os espaços de indentação também passam a fazer parte dela. Valores ausentes são inseridos como texto: `${undefined}` produz "undefined", enquanto `${null}` produz "null". Se uma mensagem contiver inesperadamente “undefined”, inspecione a variável inserida e o ponto em que um valor foi atribuído a ela.

Principais conclusões

  • Crases ativam marcadores de posição ${...}.
  • Um marcador de posição avalia uma expressão e insere sua forma textual.
  • Formate um número calculado dentro de seu marcador de posição quando a mensagem precisar de casas decimais fixas.
  • Cadeias de caracteres entre aspas deixam os símbolos de marcadores de posição inalterados.
  • Quebras de linha e indentação de um modelo tornam-se parte da cadeia de caracteres.
4

Converter entradas e prever alterações automáticas

O texto digitado por um usuário frequentemente precisa se tornar um número para que um cálculo funcione. JavaScript também converte valores por conta própria, e sua regra de adição pode transformar um total pretendido em texto concatenado. Aprenda a escolher uma conversão, verificar entradas ausentes ou inválidas e rastrear uma expressão na ordem de avaliação. Os mesmos valores farão sentido quando forem usados como condições em vez de números.

4.1 Converter entradas sem perder seu significado

Conversão explícita significa que você escreve a conversão, usando uma ferramenta como Number(), String() ou Boolean(). Ela torna o tipo pretendido visível no ponto em que um valor entra no cálculo.

Escolha uma conversão numérica

Number() lê o texto inteiro como um número, ignorando espaços em branco nas extremidades. Number("1.5") produz 1.5, e Number(" 12 ") produz 12. Number("12px") produz NaN porque a cadeia de caracteres inteira não é numérica. O código usa ponto decimal: Number("1,5") também produz NaN.

parseInt() e parseFloat() leem um início numérico e param quando o texto deixa de ser compatível. parseInt("12px", 10) produz 12; parseFloat("3.75 kg") produz 3.75. O analisador de inteiros para no ponto decimal, portanto parseInt("0.5", 10) produz 0. parseInt("abc", 10) produz NaN porque não há um início numérico. Passe uma base para parseInt(): parseInt("08", 10) produz 8, enquanto parseInt("ff", 16) lê hexadecimal e produz 255.

O operador unário de adição também converte texto numérico comum: +"42" produz 42.

Mantenha entradas ausentes separadas de zero

Um prompt retorna uma cadeia de caracteres ou null. Cancelar retorna null, e confirmar uma caixa vazia retorna "". Ambos se tornam zero com Number(), assim como texto composto apenas de espaços em branco. Verifique a ausência antes de converter:

const input = prompt("Enter a quantity:");
if (input === null || input.trim() === "") {
  console.log("No quantity entered.");
} else {
  const quantity = Number(input);
  if (Number.isNaN(quantity)) {
    console.log("Please type a number.");
  } else {
    console.log(quantity + 1);
  }
}

O || ignora a chamada de trim() quando input é null. Digitar “12” chega ao cálculo numérico e exibe 13. Digitar “12px” chega à mensagem de número inválido. Digitar “0” é uma resposta válida e exibe 1.

Use Number.isNaN(value) para testar um valor NaN real. value === NaN nunca é verdadeiro. A função global mais antiga isNaN() primeiro converte seu argumento: isNaN("hello") é true, mas Number.isNaN("hello") é false porque esse valor ainda é uma cadeia de caracteres.

Converta para texto ou booleano

String(42) produz "42", String(true) produz "true" e String(null) produz "null". (42).toString() também produz "42", mas chamar .toString() em null ou undefined lança TypeError. String() lida com ambos.

Boolean() retorna false para false, 0, -0, 0n, "", null, undefined e NaN; esses são valores avaliados como falsos. Navegadores também têm o objeto legado document.all, avaliado como falso. Outros valores são avaliados como verdadeiros. Em particular, "0", "false" e uma cadeia com um único espaço são todos avaliados como verdadeiros. !!value produz a mesma conversão booleana.

Para duas respostas de prompt "12" e "30", a + b produz "1230". Converta as duas entradas primeiro: Number(a) + Number(b) produz 42.

Principais conclusões

  • Number() espera que a cadeia de caracteres inteira seja numérica; analisadores podem ler um prefixo numérico.
  • Verifique Cancelar e entradas vazias antes da conversão numérica para que não se tornem zero.
  • Use Number.isNaN() para detectar um resultado numérico inválido.
  • Cadeias de caracteres não vazias como "false" são avaliadas como verdadeiras.
  • String() pode converter null e undefined com segurança.

4.2 Prever a coerção uma operação por vez

Coerção de tipos é a conversão automática de tipos dentro de uma operação. Suas regras dependem do operador. Um cálculo que parece funcionar ainda pode conter um valor de texto que cause uma falha em uma etapa posterior.

Acompanhe a regra da adição

Para operandos comuns dos tipos number, string, boolean, null e undefined, + concatena texto se um dos operandos for uma cadeia de caracteres. Caso contrário, ele realiza conversão numérica e adição. "5" + 2 produz "52", e 2 + "5" produz "25".

Avalie uma cadeia da esquerda para a direita:

console.log(1 + 2 + "3"); // 33
console.log("3" + 1 + 2); // 312

Na primeira expressão, dois números somam 3; adicionar "3" em seguida concatena as duas formas textuais em "33". Na segunda, a primeira operação já produz "31", portanto a operação final acrescenta outro dígito. Parênteses podem alterar qual operação ocorre primeiro: "3" + (1 + 2) produz "33".

Outras operações aritméticas esperam números

Subtração, multiplicação, divisão, resto e potências convertem cadeias de caracteres numéricas em números. "5" - 2 produz 3, "5" * "2" produz 10, e "10" / "4" produz 2.5. Uma cadeia como "abc" não pode se tornar um número válido, portanto "abc" * 2 produz NaN. Bigints têm regras aritméticas separadas; misturar um deles com um number lança TypeError.

Essa diferença pode esconder um erro:

const price = "20";
console.log(price * 3); // 60
console.log(price + 5); // 205

A multiplicação converte o preço, mas não altera a variável. A adição posterior ainda encontra uma cadeia de caracteres. Converta uma vez quando a entrada chegar e continue trabalhando com o resultado numérico.

Rastreie pequenas conversões automáticas

Em operações aritméticas numéricas, true torna-se 1, false torna-se 0 e null torna-se 0. Assim, true + true produz 2, enquanto null + 1 produz 1. undefined torna-se NaN, portanto undefined + 1 é NaN. Os operadores unários de adição e subtração convertem cadeias numéricas: +"42" produz 42, -"5" produz -5 e +"" produz 0.

++ sempre solicita uma atualização numérica, mas += segue a regra da adição:

let count = "5";
count++;
console.log(count, typeof count); // 6 number
let label = "5";
label += 1;
console.log(label, typeof label); // 51 string
Condições aplicam uma conversão diferente

Uma condição if avalia um valor como verdadeiro ou falso. "0" é uma cadeia de caracteres não vazia e passa no teste; o número 0 é avaliado como falso e faz o bloco ser ignorado. Se zero for uma quantidade válida, uma verificação de valor verdadeiro ou falso por si só não consegue distinguir zero de uma resposta ausente. Para um valor representado por um número ou null, quantity !== null testa explicitamente a ausência.

A igualdade também oferece dois comportamentos: "7" == 7 é true após a coerção, mas "7" === 7 é false porque a igualdade estrita preserva a distinção entre tipos. Use igualdade estrita para comparações comuns.

Quando um resultado for texto concatenado ou NaN, exiba cada entrada junto de typeof input. Encontre o primeiro tipo incorreto e corrija a conversão naquele ponto. Transformar "205" em um número no final produziria 205, não a soma pretendida 25.

Principais conclusões

  • Para valores primitivos comuns, um operando do tipo cadeia de caracteres faz + concatenar.
  • Rastreie cadeias de + da esquerda para a direita, respeitando os parênteses.
  • Outras operações aritméticas convertem cadeias numéricas sem alterar as variáveis originais.
  • ++ converte para número, enquanto += pode acrescentar texto.
  • Ser avaliado como verdadeiro ou falso é diferente de ser válido: zero pode ser uma entrada válida.
5

Comparar valores e escolher um caminho

Decisões transformam valores em ações: uma comparação pode decidir se uma medida está dentro de um intervalo, se uma mensagem está ausente ou se uma opção fixa corresponde. Combine testes com cuidado e use-os para escolher um valor ou um bloco de código. A ordem dos ramos e os tipos comparados afetam o resultado. Rastreie cada condição com entradas concretas, incluindo zero, uma cadeia de caracteres vazia e um valor exatamente em um limite.

5.1 Comparar valores sem pressupostos ocultos

Uma comparação produz um booleano. 7 > 3 é true, 5 >= 5 inclui igualdade e é true, e 4 < 2 é false. Armazene um resultado como const isAdult = age >= 18; ou use-o diretamente em uma condição.

Prefira igualdade estrita

=== compara sem converter tipos. Dois valores primitivos comuns devem ter o mesmo tipo e valores correspondentes: 7 === 7 é true, enquanto "7" === 7 é false. !== inverte a igualdade estrita, portanto "7" !== 7 é true.

A igualdade não estrita, ==, pode converter operandos. "7" == 7, 0 == "" e "0" == false são todos true. Sua regra especial para valores ausentes faz null == undefined ser verdadeiro, mas null == 0 ser falso. != inverte a igualdade não estrita. Prefira === e !==; um uso deliberado de value == null pode testar tanto null quanto undefined.

Distinga a ordenação textual da numérica

Duas cadeias de caracteres são comparadas da esquerda para a direita usando seus valores de código UTF-16. Para palavras comuns em inglês com as mesmas maiúsculas ou minúsculas, "apple" < "banana" é true. Um prefixo correspondente mais curto vem primeiro: "apple" < "apples" é true. Entre as letras inglesas sem acento, as maiúsculas vêm antes das minúsculas, portanto "Zebra" < "apple" é true. Converter as duas cadeias com toLowerCase() elimina essa diferença em comparações simples de letras inglesas.

Cadeias de dígitos também seguem a ordem textual:

console.log("10" < "9"); // true
console.log("10" < 9);   // false

Na primeira comparação, o caractere “1” vem antes de “9”. Na segunda, um operando é numérico, portanto o texto torna-se o número 10. Converta entradas numéricas deliberadamente antes de comparar seus valores. "abc" < 5 e "abc" > 5 produzem ambos false porque a conversão numérica produz NaN.

Trate primeiro números ausentes e inválidos

NaN não é igual a si mesmo: tanto NaN === NaN quanto NaN == NaN são false. Use Number.isNaN() para reconhecê-lo.

Comparações relacionais convertem null em zero, portanto null >= 0 é true, mas null > 0 é false. A igualdade tem uma regra diferente, portanto null == 0 permanece false. undefined torna-se NaN em comparações relacionais, então undefined > 0 e undefined < 0 são falsos; undefined == 0 também é falso. Verifique se há um valor ausente antes de tratá-lo como uma medida.

Compare decimais e intervalos

O arredondamento binário faz com que 0.1 + 0.2 === 0.3 seja falso. Para esses valores pequenos, um teste de tolerância funciona:

const closeEnough = Math.abs((0.1 + 0.2) - 0.3) < 0.000001;
console.log(closeEnough); // true

Math.abs() remove o sinal da diferença. Escolha uma tolerância adequada à magnitude e à precisão dos valores ou calcule em unidades inteiras, como milímetros.

Não encadeie testes de intervalo como na matemática. Com x = 50, 0 < x < 10 primeiro produz true e depois compara esse booleano como 1 < 10, resultando em true. Da mesma forma, 3 > 2 > 1 torna-se true > 1, ou 1 > 1, que é falso. Escreva as duas comparações por completo: x > 0 && x < 10.

Principais conclusões

  • A igualdade estrita verifica os tipos sem coerção.
  • Duas cadeias de dígitos são comparadas como texto; converta-as para comparar seus valores numéricos.
  • Verifique valores ausentes e NaN antes de comparações numéricas.
  • Resultados decimais podem precisar de uma tolerância em vez de igualdade exata.
  • Una duas comparações de intervalo com &&; não as encadeie.

5.2 Combinar testes e escolher valores padrão

Operadores lógicos permitem que uma condição expresse vários requisitos. Com operandos booleanos, && significa E, || significa OU e ! significa NÃO. Sua ordem de avaliação também permite proteger uma operação que falharia com um valor ausente.

Expresse cada requisito
const temperatureC = 25;
const inRange = temperatureC >= 18 && temperatureC <= 30;
const outside = temperatureC < 18 || temperatureC > 30;

inRange é verdadeiro porque ambos os limites são satisfeitos. outside é falso porque nenhum dos testes de estar fora é satisfeito. OU inclui o caso em que ambos os lados são verdadeiros; não significa “um, mas nunca ambos”.

Escreva cada comparação por completo. color === "red" || "green" não testa se uma das duas cores corresponde. Com color = "blue", a primeira comparação é falsa, mas a cadeia de caracteres não vazia "green" é avaliada como verdadeira. O teste pretendido é color === "red" || color === "green".

Agrupe a condição pretendida

NÃO tem precedência sobre E, e E tem precedência sobre OU. Assim, true || false && false é verdadeiro, mas (true || false) && false é falso.

Suponha que o acesso exija uma conexão e o papel de administrador ou de proprietário. Escreva loggedIn && (isAdmin || isOwner). Sem parênteses, loggedIn && isAdmin || isOwner permite que isOwner torne toda a expressão verdadeira mesmo com loggedIn = false. Os parênteses mantêm o requisito de conexão associado aos dois papéis.

Inverter uma condição composta também altera o conectivo. !(a && b) tem o mesmo valor lógico que !a || !b; !(a || b) equivale a !a && !b. Para uma temperatura fora do intervalo inclusivo, inverter os dois testes internos altera >= para <, <= para > e E para OU.

Pare quando o resultado for conhecido

E para no primeiro operando avaliado como falso; OU para no primeiro operando avaliado como verdadeiro. Isso é avaliação de curto-circuito. O operando ignorado não é avaliado:

const input = null;
const hasText = input !== null && input.trim() !== "";
console.log(hasText); // false

O primeiro teste é falso, portanto trim() nunca é chamado em null. Inverter esses dois testes tentaria a operação insegura primeiro.

Esses operadores retornam um operando, não necessariamente um booleano. "" || "Guest" retorna "Guest"; "Sam" || "Guest" retorna "Sam". "Ana" && "ok" retorna "ok", e null && "x" retorna null. Um if que envolva a expressão então avalia o valor retornado como verdadeiro ou falso.

Preserve valores significativos avaliados como falsos
ExpressãoQuando o valor alternativo substitui a entrada
`value
value ?? fallbackApenas para null ou undefined

Com quantity = 0, quantity || 1 produz 1, mas quantity ?? 1 preserva 0. Com nickname = "", nickname || "Anonymous" produz o valor alternativo, enquanto nickname ?? "Anonymous" preserva a cadeia de caracteres vazia. Use ?? quando esses valores forem significativos.

Use parênteses ao misturar ?? com E ou OU: a || b ?? c é um erro de sintaxe, enquanto (a || b) ?? c tem um agrupamento explícito. NÃO primeiro converte para um booleano e depois o inverte: !0 é verdadeiro e !"0" é falso. O duplo NÃO, !!value, produz um booleano propriamente dito.

Principais conclusões

  • E exige que ambos os testes sejam satisfeitos; OU exige pelo menos um.
  • Parênteses mantêm requisitos compartilhados associados a todos os casos permitidos.
  • A avaliação de curto-circuito ignora um operando quando o resultado já está definido.
  • && e || retornam valores dos operandos, que podem não ser booleanos.
  • ?? substitui apenas null e undefined, preservando zero e texto vazio.
  • Misturar ?? diretamente com E ou OU exige parênteses.

5.3 Escolher ramos, valores e casos fixos

Uma instrução if executa um bloco quando sua condição é avaliada como verdadeira. Um else é executado quando essa condição é avaliada como falsa. Use chaves para mostrar exatamente quais instruções pertencem a cada ramo.

Ordene uma cadeia de decisões

Uma cadeia de else if verifica as condições de cima para baixo. A primeira condição satisfeita determina o bloco executado, e todos os ramos posteriores são ignorados:

const score = 85;
let grade;
if (score >= 90) {
  grade = "A";
} else if (score >= 80) {
  grade = "B";
} else if (score >= 70) {
  grade = "C";
} else {
  grade = "F";
}

A primeira comparação falha; a segunda é satisfeita, portanto grade torna-se "B". Testar score >= 70 primeiro incluiria até uma pontuação de 95 e atribuiria "C". Para limites mínimos sobrepostos, coloque o mais alto primeiro. A variável compartilhada grade é declarada fora dos ramos para que o código posterior possa lê-la.

Uma condição composta pode manter uma decisão curta legível. O frete é grátis para um total de pedido de pelo menos 50 ou para um membro; caso contrário, custa 4,95:

const orderTotal = 45;
const isMember = false;
let shipping;
if (orderTotal >= 50 || isMember) {
  shipping = 0;
} else {
  shipping = 4.95;
}
console.log(`To pay: ${orderTotal + shipping}`);
// To pay: 49.95

Duas condições aninhadas sem ramos else muitas vezes podem ser unidas com E: if (isLoggedIn) { if (isAdmin) { ... } } executa seu código mais interno sob as mesmas condições booleanas que if (isLoggedIn && isAdmin) { ... }.

Evite pontuação que altere o caminho

Sem chaves, apenas a próxima instrução pertence a um if; a indentação não pode adicionar outra instrução a ele. Um ponto e vírgula imediatamente após a condição cria uma instrução vazia: if (x > 5); { ... } faz o bloco seguinte ser executado independentemente da condição.

if (x = 5) atribui 5 e depois avalia o valor como verdadeiro ou falso. Ele altera x e passa no teste porque 5 é avaliado como verdadeiro. Para comparar, use if (x === 5).

Escolha um valor com uma expressão condicional

O operador condicional, ou ternário, retorna um de dois valores:

const age = 17;
const status = age >= 18 ? "adult" : "minor";
console.log(status); // minor

A forma é condition ? valueIfTrue : valueIfFalse. Use-a para uma escolha curta dentro de uma atribuição ou de um literal de modelo. Use if/else para ramos de instruções. Expressões condicionais com muitos níveis de aninhamento tornam as escolhas difíceis de acompanhar.

Compare opções fixas com switch
const day = "Sat";
let kind;
switch (day) {
  case "Sat":
  case "Sun":
    kind = "weekend";
    break;
  default:
    kind = "weekday";
}

switch compara o valor estritamente com seus rótulos de caso. Ambos os rótulos de fim de semana chegam à mesma atribuição. break sai do switch; default trata um valor sem caso correspondente. switch ("2") não corresponde a case 2: porque os tipos são diferentes.

Após uma correspondência, a execução continua pelos casos posteriores até um break ou o final. Essa continuação entre casos pode ser deliberada, como em rótulos em sequência, ou acidental. Se o caso 2 adiciona uma palavra e não tem um break antes de o caso 3 adicionar outra, ambas as adições são executadas. Um rótulo de caso é um ponto de entrada, não uma nova condição testada após cada instrução.

Principais conclusões

  • Uma cadeia de else if executa apenas seu primeiro ramo cuja condição é satisfeita.
  • Declare um resultado fora dos ramos quando instruções posteriores precisarem dele.
  • Use chaves e não coloque ponto e vírgula diretamente após uma condição if.
  • = atribui um valor; === compara valores.
  • O operador condicional escolhe um valor.
  • switch compara estritamente e precisa de break para interromper a continuação entre casos.
6

Encontrar a primeira etapa incorreta

Uma mensagem de erro pode apontar diretamente para um erro, mas um programa também pode ser executado com sucesso e produzir o resultado errado. Leia o tipo, a mensagem e a localização no console e depois rastreie os valores relevantes. Quando as mensagens exibidas deixarem dúvidas demais, pause a execução e avance passo a passo. Uma pequena rotina de depuração reproduzível ajuda você a testar uma causa por vez e verificar a correção no programa salvo.

6.1 Ler erros e rastrear resultados incorretos

Um programa pode falhar antes de começar, parar durante a execução ou terminar com o resultado errado. Identifique o que aconteceu antes de alterar o código. O console fornece evidências sobre erros, enquanto mensagens com rótulos revelam valores no código executado.

Separe três tipos de problema
TipoO que aconteceExemplo
Erro de sintaxeO script não pode ser analisado; nenhuma parte desse script é executadaUm parêntese não fechado
Erro em tempo de execuçãoA execução chega a uma instrução que lança um erro; as instruções anteriores foram executadasLeitura de um nome desconhecido
Erro de lógicaO código é executado, mas o resultado está erradoDividir apenas a última parte de uma soma

Um erro de sintaxe em um script não desfaz outro script que já foi executado. Uma exceção não tratada em tempo de execução interrompe a execução atual na instrução que falhou.

Leia a mensagem completa

Uma entrada do console como Uncaught ReferenceError: totl is not defined fornece o tipo de erro e o nome que causou a falha. “Uncaught” significa que a exceção não foi tratada. Uma localização como app.js:2 aponta para o arquivo e a linha; clicar nela abre esse código.

let total = 0;
total = totl + 5;
console.log(total);

A linha 1 é executada. Na linha 2, JavaScript não consegue ler totl, portanto nunca conclui essa atribuição nem chega à exibição final. Corrigir o erro de digitação para total faz o script exibir 5.

Mensagens de sintaxe comuns mencionam um ) ausente, um token inesperado ou um token inválido. Em console.log("hi";, falta o parêntese de fechamento. Em if (x > 3 {, falta o parêntese de fechamento da condição. A linha indicada é onde o motor percebeu o problema; inspecione também logo acima dela para encontrar uma aspa ou um delimitador não fechado.

Use o tipo para restringir a causa

Um ReferenceError aponta para um nome que não pode ser acessado: um erro de digitação, um problema de escopo ou uma leitura antes da inicialização. Um TypeError significa que a operação não é adequada ao valor, como "abc".length(), null.trim() ou uma reatribuição a uma const. Um RangeError pode resultar de um argumento não aceito, como (1.5).toFixed(101).

A formulação do erro pode variar conforme o navegador. O tipo e o valor envolvido são mais úteis do que memorizar a frase inteira. Corrija o primeiro erro relevante e execute novamente, pois mensagens posteriores podem resultar da mesma causa.

Rastreie um erro de lógica

Para uma média incorreta, exiba a soma e o resultado separadamente:

const sum = 72 + 85 + 90;
const average = 72 + 85 + 90 / 3;
console.log("sum:", sum);         // 247
console.log("average:", average); // 187

A soma correta restringe a falha à etapa de divisão. Altere o cálculo para sum / 3, que produz 82.33333333333333. Quando uma adição concatenar dígitos inesperadamente, exiba também os tipos: console.log("price:", price, typeof price);. Encontre o primeiro valor que difere do esperado.

Use console.warn() ou console.error() para destacar suas próprias mensagens de diagnóstico. Verifique os filtros de nível do console se uma mensagem parecer ausente. Um 404 significa que um recurso não foi encontrado, portanto verifique o caminho do script; outras falhas de carregamento exigem a leitura da mensagem completa. Uma mensagem de inicialização ausente também pode indicar um filtro ou um erro de sintaxe.

Reproduza o problema, leia o primeiro erro, teste uma causa provável com uma pequena alteração ou uma mensagem, execute novamente e verifique o resultado esperado. Remova as mensagens temporárias quando o erro for corrigido.

Principais conclusões

  • Erros de sintaxe, de execução e de lógica exigem diferentes tipos de evidência.
  • Leia o tipo de erro, a mensagem completa e a localização.
  • A linha indicada para um erro de sintaxe pode vir depois do delimitador realmente ausente.
  • Exiba valores e tipos para encontrar a primeira etapa incorreta.
  • Verifique falhas de carregamento e filtros do console quando a saída esperada estiver ausente.

6.2 Pausar a execução e inspecionar valores durante a execução

Um depurador permite pausar um script em execução e inspecionar os valores naquele exato momento. Use o painel Sources no Chrome ou no Edge, ou o painel Debugger no Firefox. Isso é especialmente útil quando um resultado errado depende de várias operações anteriores.

Pause antes da execução da linha

Abra o script em Sources e clique no número de uma linha para definir um ponto de interrupção. A execução pausa antes de essa linha ser executada. Se o código for executado durante o carregamento da página, recarregue a página após definir o ponto de interrupção. Apenas defini-lo não executa novamente um código que já terminou.

Você também pode escrever debugger; no script. Com um depurador ativo, a instrução pausa a execução; sem um depurador, ela não tem efeito. Remova essa instrução antes de publicar o código.

Escolha a próxima ação
Controle do ChromeAtalhoEfeito
RetomarF8Continua até o próximo ponto de interrupção ou o final
Avançar sem entrarF10Executa a instrução atual sem entrar em uma função chamada
EntrarF11Entra em uma função chamada quando ela está disponível para o depurador
SairShift+F11Conclui a função atual e pausa novamente na função que a chamou

Algumas chamadas nativas não têm código-fonte JavaScript no qual você possa entrar. Avançar sem entrar é útil quando você quer o resultado da chamada sem acompanhar seu funcionamento interno.

Durante a pausa, passe o cursor sobre um nome para inspecioná-lo, leia os valores locais em Scope ou adicione uma expressão a Watch. Entradas de Watch como typeof price e total > 100 são reavaliadas conforme você avança. O console também pode avaliar expressões usando o escopo da execução pausada.

Inspecione um total enganoso

O frete grátis deveria começar em 50, mas este código o concede para um subtotal de 45 mais 4 de frete:

const subtotal = "45";
const shipping = 4;
const total = subtotal + shipping;
if (total >= 50) {
  console.log("Free shipping");
}

Defina um ponto de interrupção na linha do if e recarregue. A atribuição já foi executada. Scope mostra subtotal como a cadeia de caracteres "45" e total como "454". Uma entrada de Watch typeof total informa "string". A comparação converte "454" em número, portanto total >= 50 é satisfeita.

A falha está na adição, antes da comparação. Altere o cálculo salvo para const total = Number(subtotal) + shipping;. Recarregue novamente. O total agora é o número 49, e a condição é falsa. Se você pausar na atribuição, ela ainda não terá sido executada: avance sem entrar antes de inspecionar total inicializado.

Pause apenas onde for útil

Um ponto de interrupção condicional pausa somente quando sua expressão é verdadeira, como total > 100. Clique com o botão direito no número da linha para adicionar um. Um ponto de registro exibe uma mensagem cada vez que sua linha é executada, sem pausar ou editar o script. Pontos de interrupção em exceções pausam onde uma exceção é lançada, para que você possa inspecionar os valores no momento da falha.

Executar uma cadeia de else if passo a passo revela a qual ramo a execução chega e qual condição anterior impede verificações posteriores. Use mensagens para alguns valores conhecidos e o depurador quando a ordem ou vários valores durante a execução forem importantes. Faça a correção final no código salvo do projeto: uma alteração experimental no navegador não é uma edição duradoura do projeto. Execute novamente o caso que falhava e verifique o resultado corrigido.

Principais conclusões

  • Um ponto de interrupção em uma linha pausa antes de sua instrução ser executada; recarregue o código executado no carregamento da página.
  • Avançar sem entrar executa uma instrução; Entrar e Sair acompanham chamadas de função.
  • Scope e Watch mostram valores e expressões durante a pausa.
  • Inspecione um tipo incorreto antes da operação que o usa.
  • Um ponto de interrupção condicional filtra as pausas; um ponto de registro exibe mensagens sem pausar.
  • Salve a correção no projeto e execute novamente o caso que falhava.

Exercícios resolvidos de Variáveis e tipos em JavaScript

6 Lições Interativas

1

Carregar um script e ler suas primeiras mensagens

13 passos
Conecte um pequeno script ao HTML, escolha seu comportamento de carregamento e interprete resultados do console e de caixas de diálogo.
  1. 1
    IntroduçãoDê ao código um lugar para ser executado

    Um navegador lê HTML para construir a página e executa JavaScript para realizar instruções. Para ver um primeiro resultado, você precisa de um script conectado e de um console aberto. Vamos acompanhar uma pequena página desde a organização de seus arquivos até sua mensagem exibida e depois usar entradas do console para distinguir valores armazenados dos resultados de instruções.

  2. 2
    ExplicaçãoEscolha código incorporado ao HTML ou externo

    Um script incorporado ao HTML contém código entre suas tags. Um script externo usa src para carregar um arquivo JavaScript separado:

    <script src="js/greet.js"></script>
    

    O arquivo externo contém JavaScript sem tags HTML. Código dentro desse mesmo elemento seria ignorado porque src está presente. Mantenha a tag de fechamento </script>; o HTML não trata esse elemento como de fechamento automático.

  3. 3
    ExemploAjuste o caminho às pastas

    Coloque index.html ao lado de uma pasta chamada js, com greet.js dentro dessa pasta. O src="js/greet.js" da página começa na pasta do HTML e entra em js.

    No arquivo JavaScript, escreva:

    console.log("Page ready");
    

    Salve ambos os arquivos. Um caminho greet.js procuraria ao lado do arquivo HTML em vez de dentro de sua subpasta, portanto não encontraria esse script.

  4. 4
    ExplicaçãoExecute após a análise da página

    Adicione defer ao script clássico externo no head:

    <script src="js/greet.js" defer></script>
    

    O download ocorre durante a análise do HTML. A execução aguarda até que a análise seja concluída. Vários scripts clássicos com execução adiada mantêm sua ordem no HTML, o que importa quando um usa um valor estabelecido por outro. Adicionar defer a código clássico incorporado ao HTML não adia sua execução.

  5. 5
    DesafioMantenha scripts dependentes em ordem

    Uma página tem setup.js seguido de display.js em seu head. O segundo script usa um valor do primeiro, e ambos precisam que o conteúdo da página tenha sido analisado. Usar async em ambos preservaria esses requisitos? Qual opção de carregamento os preservaria?

    ---reveal---

    Não. Scripts async são executados quando cada download termina, portanto sua ordem e a disponibilidade da página não são garantidas. Use defer em ambos os scripts clássicos externos, mantendo setup primeiro no HTML.

  6. 6
    ConexãoReconheça um script de módulo

    Um script carregado com type="module" tem execução adiada por padrão, usa modo estrito e mantém seus nomes de nível superior dentro do módulo. Módulos podem compartilhar código por meio de import e export. Carregue páginas com módulos por um servidor de desenvolvimento local no Chrome ou no Firefox; abrir diretamente um endereço de arquivo encontra restrições de carregamento de módulos. Essas regras de carregamento são diferentes das de um script clássico comum.

  7. 7
    DicaAbra o console desta página

    No Chrome ou no Edge, abra o console com Ctrl+Shift+J no Windows/Linux ou Cmd+Option+J no Mac. O Firefox usa Ctrl+Shift+K ou Cmd+Option+K. Recarregue a página salva e procure “Page ready”. Um erro de arquivo ausente aponta para o caminho; um erro de sintaxe aponta para código que o motor não conseguiu analisar. As entradas do console pertencem à página atual.

  8. 8
    ExemploSepare exibição de avaliação

    Insira estas linhas como entradas separadas no console:

    let total = 9;
    total;
    console.log("Total:", total);
    

    A declaração pode exibir undefined como resultado. Ler total ainda produz 9. A chamada final exibe “Total: 9” e retorna undefined. O resultado exibido de uma instrução não é necessariamente o valor armazenado na variável ou a mensagem exibida por essa chamada.

  9. 9
    DesafioLeia uma declaração no console

    Você insere let count = 6; e vê undefined. Depois, insere count + 2. Qual resultado deve esperar, e a primeira exibição significou que a declaração falhou?

    ---reveal---

    O resultado é 8. A declaração armazenou 6 com sucesso; seu próprio resultado foi undefined. A expressão posterior lê esse número armazenado e adiciona 2. Não ocorre reatribuição, portanto count ainda contém 6.

  10. 10
    ExplicaçãoUse nomes exatos e observações claras

    JavaScript distingue maiúsculas de minúsculas. console.log() funciona; Console.log() procura um nome diferente. Use // para um comentário de uma linha ou /* ... */ para um mais longo. O motor ignora o texto dos comentários.

    Comece um script clássico com "use strict"; para detectar atribuições a nomes não declarados. Um erro de digitação como totl = 5; então sinaliza um erro em vez de criar um nome global acidental.

  11. 11
    ExemploInspecione o tipo de entrada da caixa de diálogo

    Execute este código de caixa de diálogo para praticar:

    const input = prompt("Quantity?", "1");
    console.log(input, typeof input);
    

    Confirmar um 6 digitado produz 6 string: os dígitos retornaram como texto. Cancelar retorna null, enquanto confirmar uma caixa vazia retorna uma cadeia de caracteres vazia. confirm() retorna um booleano, e alert() exibe uma mensagem. Uma caixa de diálogo aguarda a resposta antes de a instrução seguinte ser executada.

  12. 12
    DesafioRelacione carregamento e saída

    Um script clássico externo carregado com defer contém console.log("Started"); const answer = prompt("Code?"); console.log(typeof answer);. O usuário digita 42 e confirma. O que aparece, em ordem, e recarregar preservaria automaticamente essa resposta digitada?

    ---reveal---

    As mensagens são “Started” e “string”. Prompt retorna texto, mesmo para dígitos. Recarregar executa novamente o script salvo e abre o prompt outra vez; a variável da execução anterior não é uma edição salva no projeto.

  13. 13
    RecapitulaçãoVerifique um primeiro script

    Para um primeiro script, confirme o caminho relativo, escolha o comportamento de carregamento, salve e recarregue. Leia a mensagem do console separadamente do resultado da própria avaliação do console. Quando um prompt fornecer uma entrada, inspecione seu valor e tipo antes de construir um cálculo com ela. Um novo experimento no console altera a página em execução, portanto mantenha as edições duradouras no projeto.

2

Rastrear declarações, atualizações e escopo

11 passos
Acompanhe um total acumulado e depois preveja como blocos internos e erros de declaração afetam a execução.

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

  1. 1
    IntroduçãoAcompanhe um valor em um programa
  2. 2
    ExplicaçãoEscolha declarações conforme a reatribuição
  3. 3
    ExemploLeia o valor antigo antes de armazenar o novo
  4. 4
    ExemploCalcule um valor final uma vez
  5. 5
    DesafioEscolha a declaração adequada
  6. 6
    ExplicaçãoColoque um resultado compartilhado fora de seus ramos
  7. 7
    DesafioIdentifique o sombreamento
  8. 8
    Ideia-chaveUma vinculação pode existir antes de estar pronta
  9. 9
    DicaLeia o tipo de erro como evidência
  10. 10
    DesafioCorrija o resultado sem ocultá-lo
  11. 11
    RecapitulaçãoLeia a vinculação e depois o valor
3

Calcular um total e construir sua mensagem

18 passos
Inspecione tipos, calcule e formate resultados, transforme cadeias de caracteres e monte uma mensagem com um literal de modelo.

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

  1. 1
    IntroduçãoLeve o significado dos valores ao texto
  2. 2
    ExplicaçãoInspecione um valor antes de usá-lo
  3. 3
    DesafioPreveja uma mudança de tipo
  4. 4
    Ideia-chaveNão tire conclusões excessivas de um nome de tipo
  5. 5
    ExemploCalcule antes de formatar
  6. 6
    ExplicaçãoFaça da soma inteira o numerador
  7. 7
    DesafioEncontre os metros completos
  8. 8
    DicaEscolha o arredondamento pela direção
  9. 9
    ConexãoMantenha a precisão separada da exibição
  10. 10
    ExplicaçãoMantenha o resultado de uma transformação
  11. 11
    ExemploLeia índices e uma fatia
  12. 12
    DesafioLimpe primeiro e depois verifique
  13. 13
    Ideia-chaveSaiba se um método retorna texto
  14. 14
    ExemploInsira o total calculado
  15. 15
    DesafioEscolha os delimitadores necessários
  16. 16
    ExplicaçãoDeixe a expressão escolher uma palavra
  17. 17
    DesafioCombine limpeza e apresentação numérica
  18. 18
    RecapitulaçãoInspecione uma mensagem de dentro para fora
4

Aceitar uma quantidade sem ocultar entradas ausentes

12 passos
Acompanhe uma resposta de prompt pelas verificações de ausência, conversão, validação e operações aritméticas.

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

  1. 1
    IntroduçãoSepare a ausência de um valor numérico
  2. 2
    ExemploInspecione a resposta original
  3. 3
    ExplicaçãoVerifique a ausência antes da conversão
  4. 4
    ExemploRejeite uma conversão que falhou
  5. 5
    DesafioEscolha um analisador conforme o significado
  6. 6
    Ideia-chaveConverta em booleano sem interpretar a palavra
  7. 7
    ExemploObserve um cálculo que esconde texto
  8. 8
    ExplicaçãoAvalie uma cadeia a partir da esquerda
  9. 9
    DesafioRastreie duas atualizações diferentes
  10. 10
    DicaCorrija a entrada antes do total
  11. 11
    DesafioPreserve zero em todo o caminho
  12. 12
    RecapitulaçãoValide na ordem em que as informações ficam disponíveis
5

Construir uma decisão que corresponda às suas regras

15 passos
Compare valores, combine requisitos, preserve zeros em valores padrão e rastreie ramos e casos de switch.

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

  1. 1
    IntroduçãoTransforme uma regra em uma decisão previsível
  2. 2
    ExplicaçãoMantenha os tipos visíveis na igualdade
  3. 3
    ExemploCompare números armazenados como texto
  4. 4
    DesafioIdentifique os operandos reais de uma comparação
  5. 5
    DicaVerifique ausência e precisão numérica
  6. 6
    ExplicaçãoTorne cada requisito explícito
  7. 7
    ExemploAgrupe um requisito compartilhado
  8. 8
    DesafioMantenha um valor vazio quando ele for válido
  9. 9
    Ideia-chaveA avaliação de curto-circuito controla o que é avaliado
  10. 10
    ExemploRastreie o primeiro ramo cuja condição é satisfeita
  11. 11
    DesafioEscolha um valor ou várias instruções
  12. 12
    ExplicaçãoLeia switch como um ponto de entrada
  13. 13
    DesafioPreveja o efeito do break ausente
  14. 14
    DesafioCombine conversão com ordem dos ramos
  15. 15
    RecapitulaçãoTeste a regra em seus limites
6

Localizar e corrigir um total enganoso

12 passos
Use evidências do console e um estado pausado no depurador para encontrar um erro de tipo em um cálculo que, de resto, é executado.

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

  1. 1
    IntroduçãoEncontre onde o resultado se torna incorreto pela primeira vez
  2. 2
    ExplicaçãoClassifique a falha antes de alterar o código
  3. 3
    ExemploLeia o nome que causou a falha e sua localização
  4. 4
    DesafioDistinga análise sintática de execução
  5. 5
    DicaExiba o primeiro valor inesperado
  6. 6
    ExemploReproduza a decisão errada
  7. 7
    ExplicaçãoPause antes da comparação
  8. 8
    Ideia-chaveA conversão posterior não pode corrigir a adição
  9. 9
    DesafioInspecione antes e depois de uma atribuição
  10. 10
    DicaEscolha a pausa que responde à pergunta
  11. 11
    DesafioVerifique uma correção de tipo em uma decisão
  12. 12
    RecapitulaçãoTeste novamente a correção salva

Questões de Variáveis e tipos em JavaScript

60 Questões de Prática em 6 conjuntos

Conjunto 1: Executar código e acompanhar valores armazenados10 Questões de Prática

Questão 1 de 10

Suponha que não haja uma declaração cost anterior. O que é exibido antes de este script parar?

let cost = 8;
{
  console.log(cost);
  let cost = 12;
}
console.log(cost);
  1. Nada; a primeira exibição encontra uma zona morta temporal.
  2. 8; depois a declaração interna falha.
  3. 12; depois a exibição externa mostra 8.
  4. undefined; depois a exibição externa mostra 8.
Mostrar respostaOcultar resposta
Resposta: A
A vinculação interna cost abrange todo o bloco e sombreia a externa mesmo antes de sua declaração. A primeira exibição, portanto, lê uma vinculação interna não inicializada e lança ReferenceError antes de exibir qualquer valor. Ela não pode recorrer ao 8 externo nem ler a vinculação interna como undefined.

Questão 2 de 10

Um script exibe uma mensagem de inicialização e depois para com ReferenceError: lenght is not defined. O que você deve inspecionar primeiro?
  1. O caminho HTML do script carregado.
  2. A grafia e o escopo de lenght.
  3. A precisão decimal de seus valores.
  4. As configurações de cor de avisos do console.
Mostrar respostaOcultar resposta
Resposta: B
A mensagem de inicialização mostra que esse script começou a ser executado, e o erro identifica um nome que não pode ser lido. Inspecione se lenght foi digitado incorretamente ou está indisponível no escopo atual. Um caminho incorreto impediria a execução da instrução de inicialização desse arquivo, o que não corresponde ao observado.

Questão 3 de 10

Um comprimento medido é 386 cm. Qual par fornece seus metros inteiros e os centímetros restantes?
  1. Math.floor(386 / 100) e 386 % 100
  2. 386 / 100 e 386 % 100
  3. Math.round(386 / 100) e 386 % 100
  4. Math.floor(386 / 100) e 386 / 100
Mostrar respostaOcultar resposta
Resposta: A
Arredondar o quociente positivo para baixo fornece 3 metros inteiros, e o resto fornece os 86 centímetros que sobram. A divisão simples produz 3,86, que não é uma contagem de metros inteiros. Arredondar o quociente para o inteiro mais próximo produz 4, ultrapassando o número de metros completos no comprimento.

Questão 4 de 10

O que "catalog".slice(1, 4) retorna?
  1. "atal"
  2. "cat"
  3. "tal"
  4. "ata"
Mostrar respostaOcultar resposta
Resposta: D
As posições de uma cadeia de caracteres começam em zero, portanto o índice 1 é o primeiro “a”. slice(1, 4) copia as posições 1, 2 e 3 e exclui a posição 4, produzindo "ata". Incluir a posição final acrescentaria incorretamente a letra seguinte e produziria "atal".

Questão 5 de 10

Um programa armazena const rate = 0.15; e depois executa rate = 0.2;. O que acontece na atribuição?
  1. Ela lança um TypeError.
  2. Ela define a taxa como 0,2.
  3. Ela lança um SyntaxError.
  4. Ela deixa a taxa undefined.
Mostrar respostaOcultar resposta
Resposta: A
A declaração fornece um valor inicial válido, portanto o script pode começar. A tentativa posterior de reatribuir a vinculação const lança um TypeError quando a execução chega a ela. Um inicializador ausente tornaria a própria declaração um erro de sintaxe.

Questão 6 de 10

Qual valor é exibido?

let balance = 14;
balance = balance + 9;
balance = balance - 4;
console.log(balance);
  1. 23
  2. 10
  3. 19
  4. 14
Mostrar respostaOcultar resposta
Resposta: C
Cada atribuição lê o saldo atual, calcula o lado direito e depois armazena o novo valor. O saldo passa a 23 e depois a 19, portanto a exibição final mostra 19. Manter 23 deixaria de considerar a segunda atualização; o valor original 14 não é restaurado entre as instruções.

Questão 7 de 10

Quais valores são exibidos, em ordem?

let level = 4;
{
  let level = 9;
  console.log(level);
}
console.log(level);
  1. 9, depois 9
  2. 4, depois 9
  3. 9, depois 4
  4. 4, depois 4
Mostrar respostaOcultar resposta
Resposta: C
A declaração interna cria sua própria variável com escopo de bloco, que fornece o primeiro valor exibido. Ao sair do bloco, a variável externa inalterada volta a ficar visível, portanto o segundo valor é 4. O resultado seria 9 duas vezes somente se a instrução interna reatribuísse a variável externa em vez de declarar uma nova.

Questão 8 de 10

Qual cadeia de caracteres typeof "28" retorna?
  1. "number"
  2. "string"
  3. "object"
  4. "undefined"
Mostrar respostaOcultar resposta
Resposta: B
As aspas fazem de "28" uma cadeia de caracteres, embora seus caracteres sejam dígitos. typeof informa o tipo atual do valor e não converte o texto em número. O resultado "number" descreveria o valor sem aspas 28, não o valor apresentado aqui.

Questão 9 de 10

Uma página HTML está ao lado de uma pasta scripts que contém start.js. Qual elemento carrega esse arquivo após o término da análise do HTML?
  1. <script src="start.js" defer></script>
  2. <script src="scripts/start.js" defer></script>
  3. <script src="scripts/start.js" async></script>
  4. <script defer>scripts/start.js</script>
Mostrar respostaOcultar resposta
Resposta: B
O caminho relativo deve incluir a pasta scripts, e defer adia a execução do script clássico externo até o término da análise. async também permite o download durante a análise, mas pode executar o script antes de ela terminar. Escrever o caminho como texto incorporado ao HTML não carrega um arquivo.

Questão 10 de 10

Qual mensagem este código exibe?

// console.log("Old");
console.log("Items:", 6 + 2);
  1. “Old Items: 8”
  2. “Items: 62”
  3. “Items: 6 + 2”
  4. “Items: 8”
Mostrar respostaOcultar resposta
Resposta: D
A linha comentada é ignorada, e a expressão numérica é avaliada antes de seu resultado ser exibido. console.log() separa o rótulo e o resultado com um espaço, produzindo “Items: 8”. Unir os dígitos em “62” exigiria concatenação de cadeias de caracteres, mas ambos os operandos aqui são números.
Conjunto 2: Construir texto e converter entradas10 Questões de Prática

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

Questão 1 de 10

Dados const trays = 4; const massKg = 1.25;, o que `Mass: ${(trays * massKg).toFixed(1)} kg` produz?
  1. "Mass: 5 kg"
  2. "Mass: 41.25 kg"
  3. "Mass: 5.00 kg"
  4. "Mass: 5.0 kg"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Com const name = "Mira";, qual texto é armazenado por const label = "Hello, ${name}";?
  1. "Hello, Mira"
  2. "Hello, ${name}"
  3. "Hello, undefined"
  4. "Hello, name"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Qual valor Number("18px") produz?
  1. NaN
  2. 18
  3. 0
  4. "18"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um prompt de quantidade é cancelado. O código calcula imediatamente Number(input). Qual valor resulta e qual informação foi perdida?
  1. NaN; Cancelar deixa de ser distinto de texto inválido.
  2. null; Cancelar permanece distinto de um zero digitado.
  3. "0"; Cancelar deixa de ser distinto de texto numérico.
  4. 0; Cancelar deixa de ser distinto de um zero digitado.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Qual valor e tipo resultam de 6 + 2 + "4"?
  1. 12, número
  2. "624", cadeia de caracteres
  3. "84", cadeia de caracteres
  4. 84, número
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Após const shown = (7.5).toFixed(2);, o que shown + 1 produz?
  1. 8.5
  2. "7.501"
  3. "8.50"
  4. "7.51"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que "notes.txt".endsWith(".txt") retorna?
  1. "txt"
  2. 5
  3. true
  4. "true"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

O que é exibido?

let tag = " mixed ";
tag.trim().toUpperCase();
console.log(tag.length);
  1. 7
  2. 5
  3. 6
  4. 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma entrada é uma cadeia de caracteres ou null. Uma quantidade deve estar presente, ser não negativa e numérica; zero é permitido. Qual sequência de validação atende a todos os requisitos?
  1. Converter com Number; rejeitar números avaliados como falsos; aceitar os demais.
  2. Rejeitar null; usar parseFloat; rejeitar NaN ou valores abaixo de 0.
  3. Rejeitar null/vazio; converter com Number; rejeitar valores abaixo de 0.
  4. Rejeitar null/vazio; converter com Number; rejeitar NaN ou valores abaixo de 0.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Qual valor e tipo são exibidos?

let amount = "6";
amount += 2;
amount++;
amount -= 4;
console.log(amount, typeof amount);
  1. 58, número
  2. 5, número
  3. 59, número
  4. "59", cadeia de caracteres
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Testar comparações e escolher ramos10 Questões de Prática

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

Questão 1 de 10

Qual texto é exibido?

let route = "";
switch (3) {
  case 2:
    route += "A";
    break;
  case 3:
    route += "B";
  case 4:
    route += "C";
    break;
  default:
    route += "D";
}
console.log(route);
  1. “B”
  2. “BCD”
  3. “BC”
  4. “ABC”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Para const distance = 42;, quais são os valores de 0 < distance < 20 e distance > 0 && distance < 20, respectivamente?
  1. false e false
  2. true e false
  3. true e true
  4. false e true
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Qual é o resultado de "16" === 16?
  1. true
  2. "false"
  3. NaN
  4. false
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um sensor armazena suas leituras como cadeias de caracteres. Por que "24" < "8" é avaliado como verdadeiro?
  1. Ambas as cadeias são convertidas em números antes da comparação.
  2. Os primeiros caracteres diferentes no texto são “2” e “8”.
  3. A comparação verifica o valor numérico da cadeia mais curta.
  4. O operador menor que inverte a ordem numérica para cadeias.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Qual é o resultado da avaliação de 0 ?? 5?
  1. 0
  2. 5
  3. false
  4. null
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma leitura deve ser de pelo menos 12 e no máximo 28. Qual condição testa esse intervalo com extremos incluídos?
  1. reading > 12 && reading < 28
  2. reading >= 12 || reading <= 28
  3. reading >= 12 && reading <= 28
  4. 12 <= reading <= 28
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que é exibido?

const points = 76;
let badge;
if (points >= 60) {
  badge = "bronze";
} else if (points >= 75) {
  badge = "silver";
} else {
  badge = "none";
}
console.log(badge);
  1. “silver”
  2. “bronze”
  3. “none”
  4. “bronze silver”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Com const active = false;, o que active ? "Ready" : "Waiting" produz?
  1. "Ready"
  2. false
  3. undefined
  4. "Waiting"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Qual valor é exibido?

const mode = "2";
let label = "idle";
switch (mode) {
  case 2:
    label = "fast";
    break;
  default:
    label = "normal";
}
console.log(label);
  1. “normal”
  2. “fast”
  3. “idle”
  4. “fast normal”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

A publicação exige aprovação e o papel de editor ou de proprietário. Com approved = false, isEditor = false e isOwner = true, o código usa approved && isEditor || isOwner. Qual resultado ele produz e qual condição garante a regra completa?
  1. false; usar approved && (isEditor || isOwner)
  2. true; usar approved || (isEditor && isOwner)
  3. true; usar approved && (isEditor || isOwner)
  4. false; usar approved || (isEditor && isOwner)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Rastrear erros e inspecionar a execução10 Questões de Prática

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

Questão 1 de 10

Um script calcula a área de um retângulo somando os comprimentos de seus dois lados. Ele é executado e exibe a área errada sem uma mensagem de erro. Que tipo de erro é esse?
  1. Um erro de lógica.
  2. Um erro de sintaxe.
  3. Um ReferenceError.
  4. Um erro de carregamento.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

A execução pausa em total = total + 7; quando total é 11. Qual valor aparece antes de Avançar sem entrar e qual aparece depois?
  1. 18 antes; 25 depois.
  2. 11 antes; 11 depois.
  3. 11 antes; 18 depois.
  4. undefined antes; 18 depois.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Você quer uma mensagem de diagnóstico cada vez que uma linha for alcançada, sem pausar ou editar o script. Qual recurso do depurador é adequado?
  1. Um ponto de interrupção em linha.
  2. Um ponto de interrupção condicional.
  3. Um ponto de interrupção em exceções.
  4. Um ponto de registro.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O que acontece quando este script é carregado?

console.log("Begin");
let size = 4;
let size = 7;
  1. Ele exibe “Begin” e depois para com um TypeError.
  2. Um SyntaxError impede a execução de todas as linhas deste script.
  3. Ele exibe “Begin” e depois altera size para 7.
  4. Ele exibe “Begin” e depois para com um ReferenceError.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um total está errado. As mensagens mostram base: 13 number, extra: 4 string e total: 134 string. Por onde a correção deve começar?
  1. Converter o total concatenado após a adição.
  2. Formatar o total concatenado com duas casas decimais.
  3. Alterar o rótulo exibido ao lado do total.
  4. Converter a entrada extra antes da adição.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma mensagem do console no início de um script está ausente, e o console mostra um 404 para a URL desse script. O que você deve verificar primeiro?
  1. O tipo do total final calculado pelo script.
  2. O caminho do script e se o arquivo existe nesse local.
  3. A ordem das condições dentro do script carregado.
  4. O escopo das variáveis após sua última instrução.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um programa pausado mostra raw = "27", fee = 6 e total = "276" imediatamente antes de if (total > 100). Qual alteração corrige a classificação incorreta como total alto?
  1. Usar Number(raw) + fee ao calcular total.
  2. Usar Number(total) > 100 na condição.
  3. Usar total >= 100 na condição.
  4. Usar total === "276" na condição.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um script executado no carregamento exibe um resultado incorreto. Você define um ponto de interrupção em seu cálculo após o término do carregamento da página, mas ele nunca pausa. Como você pode inspecionar o cálculo e seu resultado atribuído?
  1. Retomar o script concluído e inspecionar o resultado antigo da atribuição.
  2. Entrar na página concluída e inspecionar seu texto-fonte original.
  3. Recarregar para alcançar o ponto de interrupção e avançar sem entrar na atribuição.
  4. Mover o ponto de interrupção para depois do script e esperar que ele seja executado novamente.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Quais mensagens são exibidas antes de este código parar?

console.log("One");
let current = 5;
current += unknownStep;
console.log("Two");

Suponha que unknownStep não tenha uma declaração.

  1. Nenhuma mensagem; a atualização causa um SyntaxError.
  2. Ambas as mensagens; o valor ausente torna-se NaN.
  3. Apenas “Two”; a exibição anterior é desfeita.
  4. Apenas “One”; a atualização lança um ReferenceError.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Suponha uma nova execução para cada entrada. O que acontece para null e para " 5 "?

const cleaned = input.trim() !== "" && input !== null;
const total = cleaned ? Number(input) + 2 : 0;
console.log(total);
  1. Null lança TypeError; o texto exibe 7.
  2. Null exibe 0; o texto exibe 7.
  3. Null lança TypeError; o texto exibe "52".
  4. Null exibe 0; o texto exibe "52".
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Corrigir cálculos e decisões10 Questões de Prática

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

Questão 1 de 10

O que Math.floor(-3.2) retorna?
  1. -3
  2. -4
  3. 4
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Com const count = 2;, qual mensagem `Packed ${count} ${count === 1 ? "box" : "boxes"}` produz?
  1. “Packed 2 box”
  2. “Packed 2 false”
  3. “Packed 2 boxes”
  4. “Packed count boxes”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma verificação de sufixo deve aceitar letras maiúsculas ou minúsculas. Para const label = "Draft.PDF";, qual expressão reconhece a terminação PDF?
  1. label.toLowerCase().endsWith(".pdf")
  2. label.endsWith(".pdf")
  3. label.trim().endsWith(".pdf")
  4. label.toUpperCase().endsWith(".pdf")
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma conversão numérica que falhou está armazenada em value. Qual teste detecta corretamente esse valor como NaN?
  1. value === NaN
  2. typeof value === "NaN"
  3. value == NaN
  4. Number.isNaN(value)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Quais valores saved e total contêm ao final?

let total = 8;
const saved = total++;
total *= 3;
total -= saved;
  1. saved = 9, total = 18
  2. saved = 8, total = 16
  3. saved = 9, total = 19
  4. saved = 8, total = 19
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma contagem padrão deve ser 3 somente quando a contagem original for null ou undefined. Qual par de resultados vem de count ?? 3 e count || 3 quando count é 0, e qual expressão atende à regra?
  1. 3 e 3; ambas as expressões atendem à regra.
  2. 0 e 0; ambas as expressões atendem à regra.
  3. 0 e 3; a expressão de coalescência nula atende à regra.
  4. 3 e 0; a expressão com OU atende à regra.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um distintivo deve ser “gold” para 90 ou mais e “silver” para 70–89. O que está errado nesse resultado e qual alteração corrige os limites sobrepostos?

const points = 94;
let badge;
if (points >= 70) {
  badge = "silver";
} else if (points >= 90) {
  badge = "gold";
} else {
  badge = "none";
}
  1. Atribui “gold”; testar 70 antes de 90.
  2. Atribui “silver”; testar 90 antes de 70.
  3. Atribui “silver”; mudar >= 90 para > 90.
  4. Atribui “none”; mudar >= 70 para > 70.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Após converter uma resposta de prompt, um programa usa if (!value) para rejeitar entradas numéricas inválidas. O usuário digita "0", "bad" ou "-2". Qual padrão de falha essa verificação apresenta?
  1. Rejeita zero e NaN, mas aceita o número negativo.
  2. Aceita zero, mas rejeita NaN e o número negativo.
  3. Rejeita os três porque nenhum é um número positivo.
  4. Aceita os três porque respostas de prompt são cadeias de caracteres.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que é exibido?

let stock = 0;
let status = "empty";
if (stock = 3) {
  status = "ready";
}
console.log(stock, status);
  1. 0 empty
  2. 0 ready
  3. 3 ready
  4. 3 empty
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um total ultrapassa seu limite apenas para algumas entradas. Você precisa de todos os valores locais na primeira linha do ramo de total alto sem pausar nos casos comuns. O que você deve definir e inspecionar?
  1. Um ponto de registro nessa linha; inspecionar o painel Scope pausado.
  2. Um ponto de interrupção condicional nessa linha; inspecionar Scope e Watch.
  3. Um ponto de interrupção após o fim da execução; inspecionar valores anteriores.
  4. Um ponto de interrupção em exceções; esperar que o total errado lance um erro.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 6: Combinar entradas, tipos e fluxo de controle10 Questões de Prática

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

Questão 1 de 10

Para uma entrada que seja cadeia de caracteres ou null, qual valor este código atribui a label quando input é " "?

const input = "   ";
const cleaned = input !== null && input.trim();
const label = cleaned ?? "Guest";
  1. ""
  2. "Guest"
  3. false
  4. null
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

O que é exibido?

const raw = "3";
let result = "";
switch (Number(raw)) {
  case 3:
    result += "M";
  case 4:
    result += "N";
    break;
  default:
    result = "X";
}
console.log(result);
  1. “M”
  2. “MN”
  3. “X”
  4. “MNX”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Dois scripts clássicos externos dependem da ordem no HTML e devem ser executados após a análise do documento. Qual atributo de carregamento ambos devem usar?
  1. async
  2. Apenas src
  3. defer apenas em cópias incorporadas ao HTML
  4. defer
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma mensagem mostra um valor cujo typeof é "number", mas que nunca é igual a si mesmo. Qual é esse valor e como você deve testá-lo diretamente?
  1. NaN; usar Number.isNaN(value).
  2. null; usar value === null.
  3. undefined; usar value === undefined.
  4. Infinity; usar value === Infinity.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que é exibido?

const massKg = 2.75;
const message = `Load: ${(massKg * 4).toFixed(2)} kg`;
console.log(message);
  1. “Load: 11 kg”
  2. “Load: 2,754 kg”
  3. “Load: 11.00 kg”
  4. “Load: 11.0 kg”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Você define um ponto de interrupção em const cleaned = raw.trim(); e a execução pausa ali. Como você obtém e inspeciona o valor inicializado de cleaned?
  1. Inspecionar cleaned antes de executar a instrução.
  2. Avançar sem entrar na instrução e depois inspecionar cleaned.
  3. Retomar e esperar uma pausa na linha seguinte.
  4. Sair para ignorar a inicialização da variável.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que é exibido?

const raw = "18";
const fee = 3;
const total = raw * 2 + fee;
const label = raw + fee * 2;
console.log(total, label);
  1. "363" e "186"
  2. 39 e 42
  3. 39 e "186"
  4. "363" e 42
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

A exibição final deve mostrar um rótulo de envio para cada ramo. Qual correção preserva o resultado externo pretendido?

let label = "pending";
if (true) {
  let label = "sent";
}
console.log(label);
  1. Alterar a declaração externa para const label = "pending";.
  2. Alterar a declaração interna para const label = "sent";.
  3. Remover a declaração externa e manter a exibição final.
  4. Alterar a linha interna para label = "sent";.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma medida pode ser null, NaN ou um número. O intervalo válido inclui 0 e 10. Qual teste aceita exatamente os valores numéricos nesse intervalo?
  1. !Number.isNaN(value) && value >= 0 && value <= 10
  2. value !== null && !Number.isNaN(value) && value > 0 && value < 10
  3. value !== null && !Number.isNaN(value) && value >= 0 && value <= 10
  4. value !== null && !Number.isNaN(value) && (value >= 0 || value <= 10)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um script é carregado sem erro, mas mostra uma média de 32 para as medidas 8, 12 e 36. A exibição da soma é 56; o cálculo é 8 + 12 + 36 / 3. Qual diagnóstico e correção correspondem a todas as evidências?
  1. Apenas 36 é dividido; usar (8 + 12 + 36) / 2.
  2. Apenas parte da soma precisa ser agrupada; usar 8 + (12 + 36) / 3.
  3. Os dois primeiros valores precisam ser agrupados; usar (8 + 12) / 3 + 36.
  4. Apenas 36 é dividido; usar (8 + 12 + 36) / 3.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

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

A

Análise do prefixo numérico
A análise do prefixo numérico lê um número do início de um texto e para no primeiro caractere que não faz parte do número.
A chamada parseFloat("6.2 kg") lê 6.2, enquanto Number("6.2 kg") rejeita toda a cadeia de caracteres como NaN.
Atribuição
Uma atribuição avalia uma expressão à direita e armazena seu valor na vinculação nomeada à esquerda, usando o operador =.
A atualização count = count + 1; usa a contagem anterior para calcular o valor que a substitui.
Atribuição composta
Uma atribuição composta combina uma operação com o armazenamento de seu resultado, usando um operador como +=, -= ou *= em uma variável existente.
Para let code = "7";, code += 2 armazena "72" porque a atribuição composta com adição ainda segue a regra de concatenação de texto.
Atributo async
O atributo async permite que um script seja baixado durante a análise e executado assim que estiver pronto, sem preservar a ordem do HTML.
Um contador de visitantes independente pode usar async quando nenhum outro script depende de sua execução prévia.
Atributo defer
O atributo defer faz um script clássico externo ser executado após a análise do HTML, permitindo seu download durante a análise.
Dois scripts clássicos externos com defer são executados na ordem do HTML mesmo que o segundo download termine primeiro.
Avaliação de curto-circuito
A avaliação de curto-circuito ignora um operando quando um operando anterior já determina o resultado, como ocorre com um operando à esquerda de E avaliado como falso.
Testar input !== null primeiro em uma condição de proteção com E pode impedir uma chamada insegura a input.trim() quando input é null.
Avançar sem entrar (step over)
Avançar sem entrar é um controle do depurador que executa a instrução atual e pausa novamente sem entrar em funções chamadas por essa instrução.
Avance sem entrar em uma atribuição antes de inspecionar seu novo resultado, pois a linha destacada ainda não foi executada no momento da pausa.

B

Base numérica
Uma base numérica é a base usada para interpretar dígitos; parseInt() a aceita como segundo argumento para tornar explícita a base pretendida.
Usar parseInt("11", 10) lê o valor decimal onze, enquanto parseInt("11", 16) lê o valor decimal dezessete.
Booleano
Um booleano é um dos dois valores true e false, geralmente produzidos por comparações e usados para representar resultados de sim ou não.
A expressão heightM >= 2 retorna um booleano que pode decidir se uma altura atende a um requisito.

C

Cadeia de caracteres (string)
Uma cadeia de caracteres é uma sequência imutável de unidades de código UTF-16 usada para representar texto, escrita com aspas correspondentes ou crases.
Os dígitos em "203" formam um texto que pode ser concatenado ou pesquisado sem se tornar o número 203.
Cadeia de condições else if
Uma cadeia de condições else if é uma série ordenada de condições que executa o primeiro ramo cuja condição é satisfeita e ignora todos os ramos posteriores.
Verificar primeiro a pontuação mínima mais alta impede que um limite inferior capture cedo demais um resultado com pontuação maior.
Caso padrão
Um caso padrão é a entrada de switch usada quando nenhum valor de caso corresponde à entrada, fornecendo comportamento para valores sem correspondência.
Um switch de modo pode atribuir "normal" em default quando a entrada não corresponde a nenhum de seus modos especiais nomeados.
Coalescência nula
Coalescência nula é o operador ??, que escolhe um valor alternativo apenas para null ou undefined e preserva outros valores avaliados como falsos.
Se count for 0, count ?? 3 mantém zero, enquanto count || 3 o substitui pelo valor alternativo.
Coerção de tipos
Coerção de tipos é a conversão automática do tipo de um valor por um operador ou uma condição, de acordo com as regras de JavaScript para essa operação.
Em "8" * 2, a multiplicação faz a coerção do texto para número no cálculo e produz 16.
Coerção numérica
Coerção numérica é a conversão automática para um valor numérico durante uma operação que espera números, como a subtração.
A expressão "14" - 2 produz 12 sem alterar uma variável que originalmente armazenava a cadeia de caracteres.
Comentário
Um comentário é um texto marcado para leitores humanos que JavaScript ignora durante a execução, usando // ou um par correspondente de /* e */.
Colocar // antes de uma exibição temporária impede sua execução enquanto mantém o texto disponível para depois.
Comparação
Uma comparação avalia uma relação entre valores e produz true ou false, como uma correspondência, uma desigualdade ou um limite.
A comparação massKg <= 20 inclui exatamente 20 e pode ser armazenada como o resultado booleano de uma verificação de limite.
Comparação relacional
Uma comparação relacional testa a ordem usando <, >, <= ou >=; duas cadeias de caracteres usam a ordem textual, enquanto operandos numéricos mistos podem ser convertidos.
O teste "30" < "7" é verdadeiro como texto, mas converter ambos os valores em números inverte esse resultado.
Concatenação
Concatenação une valores de texto em uma nova cadeia de caracteres; o operador + faz isso quando seus operandos primitivos comuns incluem uma cadeia.
A união "Good" + " " + "morning" inclui um espaço porque a cadeia de caracteres do meio o fornece explicitamente.
Console
O console é um painel das ferramentas de desenvolvimento que exibe mensagens e erros de scripts e permite avaliar expressões JavaScript.
Inserir 6 * 7 no console da página mostra 42 sem adicionar uma instrução ao script salvo.
Contexto booleano
Um contexto booleano é um lugar em que a avaliação de um valor como verdadeiro ou falso determina o comportamento, como uma condição if ou o teste de um operador lógico.
Um apelido não vazio passa em um teste if, mas uma cadeia de caracteres vazia falha, embora ambos os valores sejam do tipo string.
Continuação entre casos (fall-through)
A continuação entre casos ocorre quando a execução prossegue de um caso switch correspondente para casos posteriores porque nenhum break ou outra saída a interrompeu.
Rótulos de caso em sequência podem compartilhar uma atribuição intencionalmente, mas um break ausente também pode acrescentar um segundo rótulo indesejado.
Conversão explícita
Conversão explícita é uma mudança de tipo escrita deliberadamente pela pessoa programadora, usando uma operação como Number(), String() ou Boolean().
Converter input antes de adicionar uma taxa deixa claro que o programa espera um total numérico.

D

Declaração
Uma declaração introduz um nome em um escopo, usando uma palavra-chave como let ou const, e também pode fornecer seu valor inicial.
A instrução let result; declara uma variável antes de o código posterior decidir qual valor armazenar nela.
Depurador
Um depurador é uma ferramenta de desenvolvimento que pode pausar a execução, inspecionar valores no escopo pausado e avançar pelo código passo a passo.
Pausar antes de uma condição que usa um total pode revelar que o total é texto concatenado, embora a condição o converta depois em número.

E

E lógico
E lógico é o operador &&, que exige que ambos os testes booleanos sejam satisfeitos e para a avaliação no primeiro operando avaliado como falso.
Uma verificação de intervalo une os limites inferior e superior com && para que uma medida precise satisfazer ambos os requisitos.
Encadeamento de métodos
O encadeamento de métodos chama um método sobre o valor retornado pela chamada anterior, permitindo escrever transformações compatíveis em sequência.
A expressão " Note ".trim().toLowerCase() primeiro remove espaços externos e depois altera as letras do resultado para minúsculas.
Erro de lógica
Um erro de lógica é um erro no raciocínio ou cálculo de um programa que permite a execução do código, mas produz um resultado incorreto.
Dividir apenas o último número de uma soma pode exibir a média errada sem produzir nenhuma mensagem de erro automática.
Erro de referência (ReferenceError)
Um ReferenceError é um erro lançado quando uma vinculação não pode ser acessada, por exemplo, porque seu nome é desconhecido ou ela não foi inicializada.
Um erro de digitação em totl + 5 pode provocar ReferenceError mesmo que uma variável total escrita corretamente exista nas proximidades.
Erro de sintaxe
Um erro de sintaxe é uma violação da gramática de JavaScript que impede o script afetado de ser analisado e começar a execução.
Um parêntese não fechado pode impedir que até mesmo uma exibição anterior de inicialização no mesmo script seja executada.
Erro de tipo (TypeError)
Um TypeError é um erro lançado quando uma operação é inadequada para seu valor, incluindo uma chamada inválida ou uma reatribuição proibida de const.
Chamar text.length() trata uma propriedade numérica como função, portanto a operação lança um TypeError.
Erro em tempo de execução
Um erro em tempo de execução é uma exceção lançada enquanto o código está sendo executado; se não for tratada, interrompe essa execução na operação que falha.
Uma variável desconhecida em uma linha posterior pode interromper o script depois que suas instruções anteriores de exibição já foram executadas.
Escopo de bloco
Escopo de bloco é a região formada pelo bloco que contém uma vinculação let ou const e por seus blocos aninhados, à qual essa vinculação pertence.
Uma const message declarada dentro do corpo de um if não pode ser lida após a execução desse corpo.
Escopo global
O escopo global é o escopo de toda a página das vinculações de nível superior de scripts clássicos que outros scripts clássicos podem acessar após a inicialização.
Um script clássico posterior pode ler uma let count de nível superior estabelecida por um script clássico anterior.
Expressão
Uma expressão é um trecho de código JavaScript avaliado como um valor, que outra expressão ou instrução pode usar em operações posteriores.
A expressão price * count pode fornecer um valor a uma atribuição ou a um marcador de posição de um literal de modelo.
Expressão monitorada (watch expression)
Uma expressão monitorada é uma expressão que o depurador reavalia durante a execução passo a passo para que você possa acompanhar um valor ou uma condição entre pausas.
Adicionar typeof total a Watch pode revelar a instrução exata em que um valor numérico se torna uma cadeia de caracteres.

F

Formatação
Formatação altera a forma como um valor é apresentado como texto, por exemplo, adicionando um número fixo de casas decimais, enquanto deixa o número original inalterado.
Usar (6).toFixed(2) dentro de um literal de modelo exibe "6.00" sem alterar o valor numérico original.

I

Igualdade estrita
Igualdade estrita é a comparação realizada por ===, que não converte os tipos dos operandos e rejeita valores de tipos diferentes.
A expressão "12" === 12 é falsa porque texto com os mesmos dígitos ainda tem um tipo diferente de um número.
Igualdade não estrita
Igualdade não estrita é a comparação realizada por ==, que pode converter operandos de tipos diferentes segundo suas próprias regras de igualdade.
A expressão "12" == 12 é verdadeira após a conversão, portanto a igualdade estrita fornece uma verificação de tipo mais previsível.
Imutabilidade
Imutabilidade significa que o conteúdo de um valor não pode mudar no próprio valor; operações sobre valores primitivos produzem novos valores.
Atribuir text = text.trim(); substitui o valor da variável por uma nova cadeia de caracteres em vez de editar a antiga.
Incremento pós-fixado
O incremento pós-fixado é a forma name++ que aumenta a variável em uma unidade, mas retorna seu valor antigo à expressão que a contém.
Com let n = 3; const old = n++;, old recebe 3, enquanto o n atualizado torna-se 4.
Inicialização
A inicialização fornece a uma vinculação declarada seu valor inicial; uma declaração const deve incluir esse valor na própria declaração.
Em const widthM = 4;, o número 4 é o inicializador que torna a vinculação pronta para leitura.
Instrução
Uma instrução é um comando JavaScript que realiza uma ação, como declarar uma variável, atribuir um valor ou escolher um ramo.
Em let score = 8; console.log(score);, a instrução de declaração é executada antes da instrução de exibição.
Instrução switch
Uma instrução switch compara um valor estritamente com rótulos de caso, entra em uma correspondência e continua até um break ou o final.
Um valor textual "4" ignora um case 4: numérico a menos que a entrada tenha sido convertida antes do switch.
Interpolação
Interpolação é a inserção de uma expressão avaliada em um texto ao seu redor, como JavaScript faz em marcadores de posição de literais de modelo.
Com name = "Nora", a interpolação em `Hello, ${name}` cria a saudação “Hello, Nora”.

Í

Índice
Um índice é uma posição numerada usada para acessar unidades de código de uma cadeia de caracteres, começando em zero e terminando em length menos uma unidade.
Em "planet", o índice 0 contém "p" e o índice 5 contém "t"; o índice 6 está além do final.

L

Leis de De Morgan
As leis de De Morgan descrevem como negar um teste booleano combinado inverte cada operando e troca E por OU ou OU por E.
Um valor fora de um intervalo inclusivo está abaixo de seu limite inferior OU acima de seu limite superior, invertendo o teste de estar dentro.
Literal de modelo (template literal)
Um literal de modelo é uma cadeia de caracteres delimitada por crases que permite expressões incorporadas e quebras de linha literais em seu texto.
Uma mensagem como `Count: ${count}` coloca a contagem atual ao lado de seu rótulo descritivo.

M

Marcador de posição (placeholder)
Um marcador de posição é a parte ${...} de um literal de modelo em que uma expressão é avaliada e sua forma textual é inserida.
Dentro de `Mass: ${count * massKg} kg`, o marcador de posição calcula o total antes de inseri-lo.
Método
Um método é uma função acessada por meio de um valor ou objeto e chamada com parênteses para realizar uma operação sobre ele.
A chamada label.toLowerCase() produz texto em minúsculas, enquanto omitir os parênteses não chama o método.
Modo estrito
O modo estrito é um modo de execução de JavaScript que transforma certos erros silenciosos, incluindo atribuições a nomes não declarados, em erros sinalizados.
Começar um script clássico com "use strict"; ajuda a revelar uma variável com nome digitado incorretamente em sua primeira atribuição.
Motor JavaScript
Um motor JavaScript é o componente do navegador que lê e executa código JavaScript, realizando seus cálculos e decisões.
Quando a página carrega seu script, o motor executa console.log("Ready"); e o console mostra “Ready”.

N

NaN
NaN é um valor especial do tipo number que indica um resultado ou uma conversão numérica inválida e não é igual a si mesmo.
Converter "heavy" com Number() produz NaN, que Number.isNaN() pode detectar antes de operações aritméticas.
NÃO lógico
NÃO lógico é o operador !, que converte um operando em booleano e o inverte; aplicá-lo duas vezes fornece sua avaliação como verdadeiro ou falso em forma booleana.
A expressão !"0" é falsa porque a cadeia de caracteres não vazia é avaliada como verdadeira antes de seu valor booleano ser invertido.
Notação camelCase
A notação camelCase é um estilo de nomenclatura em que um nome com várias palavras começa com letra minúscula e cada palavra posterior começa com letra maiúscula, sem espaços.
Os nomes firstName e totalMassKg mostram os limites entre palavras e permanecem nomes JavaScript válidos.

O

Operador aritmético
Um operador aritmético realiza um cálculo, como adição, subtração, multiplicação, divisão, resto da divisão ou potenciação.
A expressão massKg * count usa multiplicação para calcular a massa total a partir de dois valores numéricos.
Operador condicional (operador ternário)
O operador condicional é a expressão condition ? a : b, que avalia uma condição e retorna o resultado da expressão de valor selecionada.
Uma atribuição curta pode escolher "open" ou "closed" a partir de um booleano sem escrever dois ramos de atribuição separados.
Operador unário de adição
O operador unário de adição é o operador + aplicado a um operando para solicitar conversão numérica, em vez de somar dois operandos.
A expressão +"31" produz o número 31, enquanto "31" + 1 concatena texto e produz "311".
OU lógico
OU lógico é o operador ||, que é satisfeito quando pelo menos um teste booleano é satisfeito e para a avaliação no primeiro operando avaliado como verdadeiro.
Um indicador de membro ou um total que atenda ao requisito pode satisfazer uma condição de frete; os dois não precisam ser satisfeitos juntos.

P

Ponto de interrupção (breakpoint)
Um ponto de interrupção marca um lugar onde a execução deve pausar antes de uma instrução ser executada, permitindo inspecionar o estado atual do programa.
Após definir um ponto de interrupção em um script executado no carregamento, recarregue a página para que a execução alcance essa instrução novamente.
Ponto de interrupção condicional
Um ponto de interrupção condicional pausa em sua linha somente quando uma expressão fornecida é verdadeira, ajudando a concentrar a inspeção nos casos relevantes.
Um ponto de interrupção com a condição total > 200 ignora totais menores comuns e pausa quando um resultado alto precisa ser inspecionado.
Ponto de registro (logpoint)
Um ponto de registro é uma marca do depurador que exibe uma mensagem quando a execução alcança sua linha, sem pausar ou editar o script.
Um ponto de registro pode mostrar cada valor alcançado enquanto a página continua em execução, diferentemente de um ponto de interrupção que interrompe a execução.
Ponto flutuante
Ponto flutuante é uma representação numérica que usa um conjunto finito de dígitos binários, de modo que muitas frações decimais são armazenadas aproximadamente.
Uma soma como 0.1 + 0.2 pode mostrar dígitos extras no final porque as frações armazenadas são aproximadas.
Precedência
Precedência é a regra que determina quais operadores se associam primeiro em uma expressão, a menos que parênteses alterem o agrupamento.
Em 4 + 6 * 2, a multiplicação é executada antes da adição, portanto o resultado é 16 em vez de 20.

R

Ramo
Um ramo é um bloco de código selecionado por uma condição, permitindo que um programa execute instruções diferentes para casos diferentes.
Um ramo else pode atribuir uma taxa de entrega quando a condição de entrega grátis tiver sido avaliada como falsa.
Rastreamento da execução
O rastreamento da execução acompanha a execução e os valores intermediários para localizar onde o comportamento real difere pela primeira vez do resultado esperado.
Exibir a soma e o divisor separadamente pode ajudar a localizar uma média incorreta na etapa que agrupa as operações aritméticas.
Resto da divisão
O resto da divisão é o valor que sobra depois de contabilizadas as divisões inteiras; o operador % de JavaScript produz esse valor.
Para um comprimento positivo de 478 cm, 478 % 100 fornece os 78 cm restantes após os metros completos.

S

Script de módulo
Um script de módulo é um script carregado com type="module" que tem seu próprio escopo de nível superior, usa modo estrito e tem execução adiada por padrão.
Uma página servida localmente pode carregar <script type="module" src="js/main.js"></script> para seu código de módulo.
Script externo
Um script externo é código JavaScript armazenado em um arquivo separado que um elemento script do HTML carrega por meio de seu atributo src.
O elemento <script src="js/start.js"></script> conecta a página ao código em uma subpasta.
Script incorporado ao HTML
Um script incorporado ao HTML é código JavaScript escrito dentro de um elemento script em um documento HTML, entre suas tags de abertura e fechamento.
Um bloco curto <script>console.log("Hello");</script> pode exibir uma mensagem diretamente de uma página HTML.
Sequência de escape
Uma sequência de escape começa com uma barra invertida e representa um caractere como uma aspa, quebra de linha, tabulação ou barra invertida em uma cadeia de caracteres.
A sequência cria uma quebra de linha dentro do texto mesmo quando o código é escrito em uma única linha.
Sombreamento (shadowing)
O sombreamento ocorre quando um escopo interno declara um nome já usado em um escopo externo, ocultando a vinculação externa dentro do escopo interno.
Declarar let total = 2 dentro de um bloco deixa um total externo separado inalterado quando o bloco termina.

T

Tipagem dinâmica
Tipagem dinâmica significa que valores têm tipos, enquanto uma variável pode se referir a valores de tipos diferentes após uma reatribuição.
Após let data = 5; data = "five";, typeof data informa o tipo do novo valor textual.
Tipo de dado
Um tipo de dado é uma categoria de valores que ajuda a determinar quais operações se aplicam e como essas operações tratam os valores.
Os valores 9 e "9" são exibidos de forma semelhante, mas seus tipos explicam por que adicionar uma unidade produz resultados diferentes.
Tolerância
Uma tolerância é um limite escolhido para uma diferença numérica aceitável, usado quando a precisão de um cálculo torna a igualdade exata inadequada.
Comparar uma diferença decimal absoluta com um pequeno limite pode aceitar diferenças de arredondamento sem exigir igualdade exata.

V

Validação de entrada
A validação de entrada verifica se um valor digitado atende aos requisitos de um programa antes que esse valor seja usado em operações posteriores.
Uma verificação de quantidade pode rejeitar Cancelar e texto vazio primeiro e depois rejeitar NaN ou números negativos após a conversão.
Valor avaliado como falso (falsy)
Um valor avaliado como falso é um valor que se torna false na conversão booleana, incluindo zero, texto vazio, null, undefined e NaN.
Uma quantidade numérica 0 faz com que if (quantity) ignore o bloco, mesmo quando zero é uma resposta permitida no programa.
Valor avaliado como verdadeiro (truthy)
Um valor avaliado como verdadeiro é um valor que se torna true na conversão booleana; cadeias de caracteres não vazias são avaliadas como verdadeiras independentemente de seu conteúdo.
As cadeias de caracteres "false" e "0" passam em testes de valor verdadeiro ou falso porque cada uma contém caracteres, em vez de estar vazia.
Valor indefinido (undefined)
Undefined é o valor primitivo geralmente usado quando nenhum valor foi fornecido, como após a execução de uma declaração let sem inicializador.
Após let nickname;, ler a vinculação inicializada produz undefined até que outra atribuição ocorra.
Valor Infinity
Infinity é um valor numérico especial que representa um resultado positivo ilimitado; JavaScript também tem o valor Infinity negativo.
O cálculo 8 / 0 retorna Infinity, portanto a divisão por zero nem sempre lança uma exceção.
Valor nulo (null)
Null é um valor primitivo geralmente atribuído de propósito para representar um valor vazio ou ausente nos próprios dados de um programa.
Um prompt cancelado retorna null, que o programa pode verificar antes de tentar chamar um método de cadeia de caracteres.
Valor primitivo
Um valor primitivo é um valor de um dos sete tipos primitivos de JavaScript, cujo conteúdo não pode ser alterado no próprio valor.
Um método de cadeia de caracteres retorna um novo valor de texto; ele não pode reescrever o conteúdo da cadeia original.
Variável
Uma variável é uma vinculação nomeada que se refere a um valor para que o programa possa lê-lo novamente e, se a vinculação permitir, reatribuí-lo.
Um nome como distanceKm mantém a distância medida disponível para cálculos e mensagens posteriores.
Vinculação (binding)
Uma vinculação é a associação entre um nome e o valor ao qual ele se refere; const impede a substituição dessa associação após a inicialização.
Alterar uma propriedade de um objeto em const preserva sua vinculação porque o nome ainda se refere ao mesmo objeto.

Z

Zona morta temporal
A zona morta temporal é a parte do escopo de uma vinculação anterior à sua inicialização, na qual acessar uma let ou const lança ReferenceError.
Uma let price interna impede que uma leitura anterior no mesmo bloco alcance uma variável price externa.

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