- Aprender
- Computação e TI
- Programação
- Programação em JavaScript
- Variáveis e tipos em JavaScript
Variáveis e tipos em JavaScript: primeiros passos
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
- 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 HTMLVincule 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 consoleEscreva instruções e comentários, execute código no console do navegador e mostre a saída com
console.loge as caixas de diálogo nativas do navegador.
- Adicionar JavaScript a uma página HTML
- Declare variáveis com nomes claros, decida entre
leteconste preveja onde cada variável pode ser usada.- Declarar e nomear variáveisCrie variáveis com
leteconst, dê a elas nomes válidos e legíveis e atualize aquelas que mudam. - Prever o escopo e os erros sinalizados por let e constPreveja em que parte do código uma variável pode ser usada e reconheça e corrija os erros produzidos por
leteconst.
- Declarar e nomear variáveis
- 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 typeofNomeie os tipos de dados de JavaScript, diferencie
nulldeundefinede verifique o tipo de qualquer valor comtypeof. - Calcular com números e operadores aritméticosUse 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 caracteresEscreva 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 modeloInsira 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.
- Reconhecer tipos de dados com typeof
- Converta valores explicitamente com
Number(),String()eBoolean()e preveja as conversões automáticas que JavaScript faz em operadores e condições.- Converter valores explicitamenteConverta 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 tiposPreveja os resultados de operadores aplicados a tipos diferentes e use deliberadamente valores avaliados como verdadeiros e falsos.
- Converter valores explicitamente
- Compare valores corretamente, combine condições com operadores lógicos e escolha qual código será executado com
if,else, o operador condicional eswitch.- Comparar valoresUse os operadores de comparação para produzir
trueoufalsee preveja comparações de cadeias de caracteres, tipos diferentes,null,NaNe decimais. - Combinar condições com operadores lógicosUna 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 switchEscreva cadeias de
if,else ifeelse, escolha valores com o operador condicional e trate casos fixos comswitch.
- Comparar valores
- 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 consoleDistinga 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 depuradorDefina pontos de interrupção, execute o código linha por linha e inspecione os valores das variáveis enquanto o código estiver pausado.
- Ler mensagens de erro e rastrear valores com o console
Guia de estudo de Variáveis e tipos em JavaScript
1Executar 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 carregamento | Quando o script é executado | Ordem de vários scripts |
|---|---|---|
| Clássico, sem atributo | Quando a análise chega até ele, após o carregamento | Ordem do HTML |
defer | Após a análise do HTML | Ordem do HTML |
async | Assim que seu download termina | Ordem 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
undefinedexibido 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 ounull, econfirm()retorna um booleano.- O modo estrito sinaliza atribuições a nomes não declarados como erros.
2Armazenar 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ção | Precisa de um valor inicial? | O nome pode receber uma reatribuição? |
|---|---|---|
let | Não | Sim |
const | Sim | Nã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
constpor padrão eletquando o código reatribuir o nome. - Uma declaração
constexige 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
| Problema | Tipo de erro | Correção |
|---|---|---|
const rate; | SyntaxError | Forneça um valor inicial |
Um segundo let total em um escopo | SyntaxError | Atribua sem outro let |
| Leitura antes da inicialização | ReferenceError | Inicialize antes da leitura |
| Leitura de um nome desconhecido ou fora do escopo | ReferenceError | Corrija o nome ou mova sua declaração |
Reatribuição de uma const | TypeError | Use 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
leteconsttê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é umTypeErrorem tempo de execução. - Um objeto em uma
constpode ter seu conteúdo alterado sem reatribuir o nome.
3Calcular 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
letpode armazenar tipos diferentes após uma reatribuição. typeofretorna uma cadeia de caracteres com o nome do tipo de um valor.undefinedfrequentemente significa que nenhum valor foi atribuído;nullgeralmente indica uma ausência intencional.typeof nullé"object", etypeof 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
| Operador | Significado | Exemplo |
|---|---|---|
+, - | Adição, subtração | 8 - 3 produz 5 |
*, / | Multiplicação, divisão | 7 / 2 produz 3.5 |
% | Resto da divisão | 17 % 5 produz 2 |
** | Exponenciação | 2 ** 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
| Ferramenta | Regra do resultado | Exemplo |
|---|---|---|
Math.round() | Inteiro mais próximo; metades em direção ao infinito positivo | Math.round(-2.5) produz -2 |
Math.floor() | Para baixo, em direção ao infinito negativo | Math.floor(-2.5) produz -3 |
Math.ceil() | Para cima, em direção ao infinito positivo | Math.ceil(2.1) produz 3 |
Math.trunc() | Descarta a parte fracionária em direção a zero | Math.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.
NaNe 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.
4Converter 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 converternulleundefinedcom 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.
5Comparar 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
NaNantes 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ão | Quando o valor alternativo substitui a entrada |
|---|---|
| `value | |
value ?? fallback | Apenas 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 apenasnulleundefined, 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 ifexecuta 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.
switchcompara estritamente e precisa debreakpara interromper a continuação entre casos.
6Encontrar 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
| Tipo | O que acontece | Exemplo |
|---|---|---|
| Erro de sintaxe | O script não pode ser analisado; nenhuma parte desse script é executada | Um parêntese não fechado |
| Erro em tempo de execução | A execução chega a uma instrução que lança um erro; as instruções anteriores foram executadas | Leitura de um nome desconhecido |
| Erro de lógica | O código é executado, mas o resultado está errado | Dividir 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 Chrome | Atalho | Efeito |
|---|---|---|
| Retomar | F8 | Continua até o próximo ponto de interrupção ou o final |
| Avançar sem entrar | F10 | Executa a instrução atual sem entrar em uma função chamada |
| Entrar | F11 | Entra em uma função chamada quando ela está disponível para o depurador |
| Sair | Shift+F11 | Conclui 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
1Carregar um script e ler suas primeiras mensagens
13 passos
- 1Introduçã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.
- 2ExplicaçãoEscolha código incorporado ao HTML ou externo
Um script incorporado ao HTML contém código entre suas tags. Um script externo usa
srcpara 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
srcestá presente. Mantenha a tag de fechamento</script>; o HTML não trata esse elemento como de fechamento automático. - 3ExemploAjuste o caminho às pastas
Coloque
index.htmlao lado de uma pasta chamadajs, comgreet.jsdentro dessa pasta. Osrc="js/greet.js"da página começa na pasta do HTML e entra emjs.No arquivo JavaScript, escreva:
console.log("Page ready");Salve ambos os arquivos. Um caminho
greet.jsprocuraria ao lado do arquivo HTML em vez de dentro de sua subpasta, portanto não encontraria esse script. - 4ExplicaçãoExecute após a análise da página
Adicione
deferao 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
defera código clássico incorporado ao HTML não adia sua execução. - 5DesafioMantenha scripts dependentes em ordem
Uma página tem
setup.jsseguido dedisplay.jsem seu head. O segundo script usa um valor do primeiro, e ambos precisam que o conteúdo da página tenha sido analisado. Usarasyncem 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
deferem ambos os scripts clássicos externos, mantendo setup primeiro no HTML. - 6Conexã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. - 7DicaAbra o console desta página
No Chrome ou no Edge, abra o console com
Ctrl+Shift+Jno Windows/Linux ouCmd+Option+Jno Mac. O Firefox usaCtrl+Shift+KouCmd+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. - 8ExemploSepare 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
undefinedcomo resultado. Lertotalainda produz9. A chamada final exibe “Total: 9” e retornaundefined. O resultado exibido de uma instrução não é necessariamente o valor armazenado na variável ou a mensagem exibida por essa chamada. - 9DesafioLeia uma declaração no console
Você insere
let count = 6;e vêundefined. Depois, inserecount + 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. - 10Explicaçã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 comototl = 5;então sinaliza um erro em vez de criar um nome global acidental. - 11ExemploInspecione 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, ealert()exibe uma mensagem. Uma caixa de diálogo aguarda a resposta antes de a instrução seguinte ser executada. - 12DesafioRelacione 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.
- 13Recapitulaçã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.
2Rastrear declarações, atualizações e escopo
11 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoAcompanhe um valor em um programa
- 2ExplicaçãoEscolha declarações conforme a reatribuição
- 3ExemploLeia o valor antigo antes de armazenar o novo
- 4ExemploCalcule um valor final uma vez
- 5DesafioEscolha a declaração adequada
- 6ExplicaçãoColoque um resultado compartilhado fora de seus ramos
- 7DesafioIdentifique o sombreamento
- 8Ideia-chaveUma vinculação pode existir antes de estar pronta
- 9DicaLeia o tipo de erro como evidência
- 10DesafioCorrija o resultado sem ocultá-lo
- 11RecapitulaçãoLeia a vinculação e depois o valor
3Calcular um total e construir sua mensagem
18 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoLeve o significado dos valores ao texto
- 2ExplicaçãoInspecione um valor antes de usá-lo
- 3DesafioPreveja uma mudança de tipo
- 4Ideia-chaveNão tire conclusões excessivas de um nome de tipo
- 5ExemploCalcule antes de formatar
- 6ExplicaçãoFaça da soma inteira o numerador
- 7DesafioEncontre os metros completos
- 8DicaEscolha o arredondamento pela direção
- 9ConexãoMantenha a precisão separada da exibição
- 10ExplicaçãoMantenha o resultado de uma transformação
- 11ExemploLeia índices e uma fatia
- 12DesafioLimpe primeiro e depois verifique
- 13Ideia-chaveSaiba se um método retorna texto
- 14ExemploInsira o total calculado
- 15DesafioEscolha os delimitadores necessários
- 16ExplicaçãoDeixe a expressão escolher uma palavra
- 17DesafioCombine limpeza e apresentação numérica
- 18RecapitulaçãoInspecione uma mensagem de dentro para fora
4Aceitar uma quantidade sem ocultar entradas ausentes
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoSepare a ausência de um valor numérico
- 2ExemploInspecione a resposta original
- 3ExplicaçãoVerifique a ausência antes da conversão
- 4ExemploRejeite uma conversão que falhou
- 5DesafioEscolha um analisador conforme o significado
- 6Ideia-chaveConverta em booleano sem interpretar a palavra
- 7ExemploObserve um cálculo que esconde texto
- 8ExplicaçãoAvalie uma cadeia a partir da esquerda
- 9DesafioRastreie duas atualizações diferentes
- 10DicaCorrija a entrada antes do total
- 11DesafioPreserve zero em todo o caminho
- 12RecapitulaçãoValide na ordem em que as informações ficam disponíveis
5Construir uma decisão que corresponda às suas regras
15 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoTransforme uma regra em uma decisão previsível
- 2ExplicaçãoMantenha os tipos visíveis na igualdade
- 3ExemploCompare números armazenados como texto
- 4DesafioIdentifique os operandos reais de uma comparação
- 5DicaVerifique ausência e precisão numérica
- 6ExplicaçãoTorne cada requisito explícito
- 7ExemploAgrupe um requisito compartilhado
- 8DesafioMantenha um valor vazio quando ele for válido
- 9Ideia-chaveA avaliação de curto-circuito controla o que é avaliado
- 10ExemploRastreie o primeiro ramo cuja condição é satisfeita
- 11DesafioEscolha um valor ou várias instruções
- 12ExplicaçãoLeia switch como um ponto de entrada
- 13DesafioPreveja o efeito do break ausente
- 14DesafioCombine conversão com ordem dos ramos
- 15RecapitulaçãoTeste a regra em seus limites
6Localizar e corrigir um total enganoso
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoEncontre onde o resultado se torna incorreto pela primeira vez
- 2ExplicaçãoClassifique a falha antes de alterar o código
- 3ExemploLeia o nome que causou a falha e sua localização
- 4DesafioDistinga análise sintática de execução
- 5DicaExiba o primeiro valor inesperado
- 6ExemploReproduza a decisão errada
- 7ExplicaçãoPause antes da comparação
- 8Ideia-chaveA conversão posterior não pode corrigir a adição
- 9DesafioInspecione antes e depois de uma atribuição
- 10DicaEscolha a pausa que responde à pergunta
- 11DesafioVerifique uma correção de tipo em uma decisão
- 12RecapitulaçãoTeste novamente a correção salva
Questões de Variáveis e tipos em JavaScript
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);
Mostrar respostaOcultar resposta
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
ReferenceError: lenght is not defined. O que você deve inspecionar primeiro?Mostrar respostaOcultar resposta
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
Mostrar respostaOcultar resposta
Questão 4 de 10
"catalog".slice(1, 4) retorna?Mostrar respostaOcultar resposta
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
const rate = 0.15; e depois executa rate = 0.2;. O que acontece na atribuição?Mostrar respostaOcultar resposta
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);
Mostrar respostaOcultar resposta
Questão 7 de 10
Quais valores são exibidos, em ordem?
let level = 4;
{
let level = 9;
console.log(level);
}
console.log(level);
Mostrar respostaOcultar resposta
Questão 8 de 10
typeof "28" retorna?Mostrar respostaOcultar resposta
"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
scripts que contém start.js. Qual elemento carrega esse arquivo após o término da análise do HTML?Mostrar respostaOcultar resposta
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);
Mostrar respostaOcultar resposta
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
const trays = 4; const massKg = 1.25;, o que `Mass: ${(trays * massKg).toFixed(1)} kg` produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
const name = "Mira";, qual texto é armazenado por const label = "Hello, ${name}";?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Number("18px") produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Number(input). Qual valor resulta e qual informação foi perdida?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
6 + 2 + "4"?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
const shown = (7.5).toFixed(2);, o que shown + 1 produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
"notes.txt".endsWith(".txt") retorna?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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
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?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);
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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
const distance = 42;, quais são os valores de 0 < distance < 20 e distance > 0 && distance < 20, respectivamente?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
"16" === 16?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
"24" < "8" é avaliado como verdadeiro?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
0 ?? 5?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
const active = false;, o que active ? "Ready" : "Waiting" produz?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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
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?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
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
total = total + 7; quando total é 11. Qual valor aparece antes de Avançar sem entrar e qual aparece depois?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
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;
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
base: 13 number, extra: 4 string e total: 134 string. Por onde a correção deve começar?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
raw = "27", fee = 6 e total = "276" imediatamente antes de if (total > 100). Qual alteração corrige a classificação incorreta como total alto?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
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.
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);
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
Math.floor(-3.2) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
const count = 2;, qual mensagem `Packed ${count} ${count === 1 ? "box" : "boxes"}` produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
const label = "Draft.PDF";, qual expressão reconhece a terminação PDF?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
value. Qual teste detecta corretamente esse valor como NaN?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;
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
count ?? 3 e count || 3 quando count é 0, e qual expressão 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";
}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
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?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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
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";
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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
typeof é "number", mas que nunca é igual a si mesmo. Qual é esse valor e como você deve testá-lo diretamente?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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
const cleaned = raw.trim(); e a execução pausa ali. Como você obtém e inspeciona o valor inicializado de cleaned?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);
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);
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
null, NaN ou um número. O intervalo válido inclui 0 e 10. Qual teste aceita exatamente os valores numéricos nesse intervalo?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
8 + 12 + 36 / 3. Qual diagnóstico e correção correspondem a todas as evidências?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Análise do prefixo numérico
parseFloat("6.2 kg") lê 6.2, enquanto Number("6.2 kg") rejeita toda a cadeia de caracteres como NaN.Atribuição
count = count + 1; usa a contagem anterior para calcular o valor que a substitui.Atribuição composta
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
async quando nenhum outro script depende de sua execução prévia.Atributo defer
defer são executados na ordem do HTML mesmo que o segundo download termine primeiro.Avaliação de curto-circuito
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)
B
Base numérica
parseInt("11", 10) lê o valor decimal onze, enquanto parseInt("11", 16) lê o valor decimal dezessete.Booleano
heightM >= 2 retorna um booleano que pode decidir se uma altura atende a um requisito.C
Cadeia de caracteres (string)
"203" formam um texto que pode ser concatenado ou pesquisado sem se tornar o número 203.Cadeia de condições else if
Caso padrão
"normal" em default quando a entrada não corresponde a nenhum de seus modos especiais nomeados.Coalescência nula
count for 0, count ?? 3 mantém zero, enquanto count || 3 o substitui pelo valor alternativo.Coerção de tipos
"8" * 2, a multiplicação faz a coerção do texto para número no cálculo e produz 16.Coerção numérica
"14" - 2 produz 12 sem alterar uma variável que originalmente armazenava a cadeia de caracteres.Comentário
// antes de uma exibição temporária impede sua execução enquanto mantém o texto disponível para depois.Comparação
massKg <= 20 inclui exatamente 20 e pode ser armazenada como o resultado booleano de uma verificação de limite.Comparação relacional
"30" < "7" é verdadeiro como texto, mas converter ambos os valores em números inverte esse resultado.Concatenação
"Good" + " " + "morning" inclui um espaço porque a cadeia de caracteres do meio o fornece explicitamente.Console
6 * 7 no console da página mostra 42 sem adicionar uma instrução ao script salvo.Contexto booleano
if, mas uma cadeia de caracteres vazia falha, embora ambos os valores sejam do tipo string.Continuação entre casos (fall-through)
Conversão explícita
input antes de adicionar uma taxa deixa claro que o programa espera um total numérico.D
Declaração
let result; declara uma variável antes de o código posterior decidir qual valor armazenar nela.Depurador
E
E lógico
&& para que uma medida precise satisfazer ambos os requisitos.Encadeamento de métodos
" Note ".trim().toLowerCase() primeiro remove espaços externos e depois altera as letras do resultado para minúsculas.Erro de lógica
Erro de referência (ReferenceError)
totl + 5 pode provocar ReferenceError mesmo que uma variável total escrita corretamente exista nas proximidades.Erro de sintaxe
Erro de tipo (TypeError)
text.length() trata uma propriedade numérica como função, portanto a operação lança um TypeError.Erro em tempo de execução
Escopo de bloco
const message declarada dentro do corpo de um if não pode ser lida após a execução desse corpo.Escopo global
let count de nível superior estabelecida por um script clássico anterior.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)
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
(6).toFixed(2) dentro de um literal de modelo exibe "6.00" sem alterar o valor numérico original.I
Igualdade estrita
"12" === 12 é falsa porque texto com os mesmos dígitos ainda tem um tipo diferente de um número.Igualdade não estrita
"12" == 12 é verdadeira após a conversão, portanto a igualdade estrita fornece uma verificação de tipo mais previsível.Imutabilidade
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
let n = 3; const old = n++;, old recebe 3, enquanto o n atualizado torna-se 4.Inicialização
const widthM = 4;, o número 4 é o inicializador que torna a vinculação pronta para leitura.Instrução
let score = 8; console.log(score);, a instrução de declaração é executada antes da instrução de exibição.Instrução switch
"4" ignora um case 4: numérico a menos que a entrada tenha sido convertida antes do switch.Interpolação
name = "Nora", a interpolação em `Hello, ${name}` cria a saudação “Hello, Nora”.Í
Índice
"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
Literal de modelo (template literal)
`Count: ${count}` coloca a contagem atual ao lado de seu rótulo descritivo.M
Marcador de posição (placeholder)
${...} de um literal de modelo em que uma expressão é avaliada e sua forma textual é inserida.`Mass: ${count * massKg} kg`, o marcador de posição calcula o total antes de inseri-lo.Método
label.toLowerCase() produz texto em minúsculas, enquanto omitir os parênteses não chama o método.Modo estrito
"use strict"; ajuda a revelar uma variável com nome digitado incorretamente em sua primeira atribuição.Motor JavaScript
console.log("Ready"); e o console mostra “Ready”.N
NaN
"heavy" com Number() produz NaN, que Number.isNaN() pode detectar antes de operações aritméticas.NÃO lógico
!"0" é falsa porque a cadeia de caracteres não vazia é avaliada como verdadeira antes de seu valor booleano ser invertido.Notação camelCase
firstName e totalMassKg mostram os limites entre palavras e permanecem nomes JavaScript válidos.O
Operador aritmético
massKg * count usa multiplicação para calcular a massa total a partir de dois valores numéricos.Operador condicional (operador ternário)
"open" ou "closed" a partir de um booleano sem escrever dois ramos de atribuição separados.Operador unário de adição
+"31" produz o número 31, enquanto "31" + 1 concatena texto e produz "311".OU lógico
P
Ponto de interrupção (breakpoint)
Ponto de interrupção condicional
total > 200 ignora totais menores comuns e pausa quando um resultado alto precisa ser inspecionado.Ponto de registro (logpoint)
Ponto flutuante
0.1 + 0.2 pode mostrar dígitos extras no final porque as frações armazenadas são aproximadas.Precedência
4 + 6 * 2, a multiplicação é executada antes da adição, portanto o resultado é 16 em vez de 20.R
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
Resto da divisão
478 % 100 fornece os 78 cm restantes após os metros completos.S
Script de módulo
<script type="module" src="js/main.js"></script> para seu código de módulo.Script externo
<script src="js/start.js"></script> conecta a página ao código em uma subpasta.Script incorporado ao HTML
<script>console.log("Hello");</script> pode exibir uma mensagem diretamente de uma página HTML.Sequência de escape
cria uma quebra de linha dentro do texto mesmo quando o código é escrito em uma única linha.Sombreamento (shadowing)
let total = 2 dentro de um bloco deixa um total externo separado inalterado quando o bloco termina.T
Tipagem dinâmica
let data = 5; data = "five";, typeof data informa o tipo do novo valor textual.Tipo de dado
9 e "9" são exibidos de forma semelhante, mas seus tipos explicam por que adicionar uma unidade produz resultados diferentes.Tolerância
V
Validação de entrada
Valor avaliado como falso (falsy)
0 faz com que if (quantity) ignore o bloco, mesmo quando zero é uma resposta permitida no programa.Valor avaliado como verdadeiro (truthy)
"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)
let nickname;, ler a vinculação inicializada produz undefined até que outra atribuição ocorra.Valor Infinity
8 / 0 retorna Infinity, portanto a divisão por zero nem sempre lança uma exceção.Valor nulo (null)
null, que o programa pode verificar antes de tentar chamar um método de cadeia de caracteres.Valor primitivo
Variável
distanceKm mantém a distância medida disponível para cálculos e mensagens posteriores.Vinculação (binding)
const preserva sua vinculação porque o nome ainda se refere ao mesmo objeto.Z
Zona morta temporal
let price interna impede que uma leitura anterior no mesmo bloco alcance uma variável price externa.Sobre esta aula
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.