T14 — 034.3 Estruturas de controle e funções do JavaScript
Resumo Conciso
Valores verdadeiros e falsos
O JavaScript avalia condições como verdadeiras se o valor for diferente de zero. true (literal) também é considerado verdadeiro.
Operadores de comparação
| Operador | Descrição |
|---|---|
== | Igualdade comum (compara valor, com coerção de tipo) |
!= | Desigualdade comum |
=== | Igualdade estrita (compara tipo e valor) |
!== | Desigualdade estrita |
< | Menor que |
> | Maior que |
<= | Menor ou igual |
>= | Maior ou igual |
Comparação comum vs. estrita:
let a = "1";let b = 1;console.log(a == b); // true (coerção: "1" convertido para 1)console.log(a === b); // false (tipos diferentes: string vs number)Operadores lógicos
| Operador | Tipo | Descrição |
|---|---|---|
&& | Binário (AND) | Verdadeiro se ambas as expressões forem verdadeiras |
|| | Binário (OR) | Verdadeiro se pelo menos uma expressão for verdadeira |
! | Unário (NOT) | Inverte o valor lógico |
Estruturas condicionais
if / else if / else
let my_number = 4;if (my_number == 3) { console.log("The value of my_number is 3");} else { console.log("The value of my_number is not 3");}- Uma ou mais declarações entre
{}formam uma declaração de bloco. - As estruturas
ifpodem ser aninhadas. - É recomendado usar
{}mesmo para uma única instrução.
switch / case / break
switch (language) { case "en": console.log("English"); break; case "es": console.log("Spanish"); break; case "pt": console.log("Portuguese"); break; default: console.log(language, " not found");}- Usa comparação estrita (
===). defaulttrata o caso sem correspondência.- Múltiplos
casepodem ser combinados (fall-through):
case "en":case "en_US":case "en_GB": console.log("English"); break;Laços (Loops)
while
Executa o bloco enquanto a condição for verdadeira:
let factor = 2;while (factor < candidate) { if (candidate % factor == 0) { is_prime = false; break; } factor++;}for
Permite inicialização, condição e expressão final numa só linha:
for (let factor = 2; factor < candidate; factor++) { if (candidate % factor == 0) { is_prime = false; break; }}for...of (iteração sobre arrays)
let candidates = [111, 139, 293, 327];for (candidate of candidates) { console.log(candidate);}Controlo de fluxo em loops
| Instrução | Efeito |
|---|---|
break | Encerra o loop imediatamente |
continue | Pula o resto do bloco e inicia a próxima iteração |
Atenção: Garantir que a condição do while muda a cada iteração para evitar loops infinitos.
Funções
Declaração de função
function test_prime(candidate) { let is_prime = true; let factor = 2; while (factor < candidate) { if (candidate % factor == 0) { is_prime = false; break; } factor++; } return is_prime;}- O nome da função segue as mesmas regras de nomenclatura de variáveis.
- Argumentos são separados por vírgulas entre parênteses.
- Declarações de função podem ser chamadas antes ou depois da sua declaração.
Expressão de função
let test_prime = function(candidate) { // corpo da função return is_prime;};- O nome
test_primeé a variável que contém a função. - Só pode ser chamada após a sua inicialização (diferente da declaração de função).
Passagem de argumentos
| Tipo | Comportamento |
|---|---|
| Por valor | Argumentos primitivos são copiados; alterações não afetam a variável original |
| Por referência | Objetos complexos são partilhados; alterações afetam o objeto original |
Instrução return
- Devolve o controlo e o valor à função de chamada.
- Não é obrigatória — sem
return, o valor de retorno éundefined. - Pode existir múltiplas instruções
return(em blocos condicionais).
Recursão
Uma função pode chamar a si própria:
function next_prime(from) { if (from < 2) return 2; if (from == 2) return 3; if (from % 2 == 0) from--; let candidate = from + 2; for (let factor = 3; factor < candidate; factor = factor + 2) { if (candidate % factor == 0) { return next_prime(candidate); // chamada recursiva } } return candidate;}- Cada invocação mantém as suas próprias variáveis isoladas na memória.
- O empilhamento de chamadas continua até que o caso base seja atingido.
🧭 Exercícios Guiados (resolvidos)
Exercício Guiado 1 — Operador AND lógico
Enunciado: Quais valores da variável my_var correspondem à condição my_var > 0 && my_var < 9?
Solução passo a passo:
- O operador
&&(AND) requer que ambas as expressões sejam verdadeiras. - A primeira expressão
my_var > 0filtra números maiores que 0. - A segunda expressão
my_var < 9filtra números menores que 9. - Resultado: valores inteiros de 1 a 8.
Exercício Guiado 2 — Operador OR lógico
Enunciado: Quais valores da variável my_var correspondem à condição my_var > 0 || my_var < 9?
Solução passo a passo:
- O operador
||(OR) requer que pelo menos uma expressão seja verdadeira. - Qualquer número será maior que 0 OU menor que 9.
- Resultado: todos os números correspondem.
Exercício Guiado 3 — Loop while infinito com continue
Enunciado: Quantas vezes o loop while a seguir executa sua declaração de bloco?
let i = 0;while (1) { if (i == 10) { continue; } i++;}Solução passo a passo:
- A condição
while (1)é sempre verdadeira. - Quando
iatinge 10,continuepulai++e volta ao início do loop. ipermanece em 10 para sempre.- Resultado: infinitas vezes (loop infinito).
Exercício Guiado 4 — Declaração vs. expressão de função
Enunciado: Qual a principal diferença entre uma declaração de função e uma expressão de função?
Solução passo a passo:
- Uma declaração de função pode ser chamada antes da sua declaração no código (hoisting).
- Uma expressão de função só pode ser chamada após a sua atribuição a uma variável.
// Declaração — pode ser chamada antestest_prime(5); // funcionafunction test_prime(candidate) { return true;}// Expressão — só funciona após a atribuiçãotest_prime2(5); // ReferenceErrorlet test_prime2 = function(candidate) { return true;};🔬 Exercícios Exploratórios (prática no terminal)
- Enunciado: O que acontece se o operador de atribuição
=for usado em vez do operador de comparação==?
let a = 1; let b = 2; if (a = b) { console.log("Executado"); // Este bloco será executado } console.log(a); // 2 (a recebeu o valor de b)Explicação: O operador = atribui o valor da direita à variável da esquerda. O resultado da atribuição (2) é avaliado como verdadeiro (diferente de 0), então o if executa. Isto é um erro comum e indesejado.
- Enunciado: Escreva um fragmento de código usando a estrutura
if, no qual uma comparação de igualdade comum retorne verdadeiro, mas uma comparação de igualdade estrita não.
let a = "1"; let b = 1; if (a == b) { console.log("Igualdade comum: verdadeiro"); } if (a === b) { console.log("Igualdade estrita: verdadeiro"); } else { console.log("Igualdade estrita: falso"); }Explicação: a == b retorna true porque o JavaScript converte a string "1" para o número 1. a === b retorna false porque os tipos são diferentes (string vs. number).
-
Enunciado: Reescreva a seguinte declaração
forusando o operador lógico unário NOT na condição de loop, mantendo o mesmo resultado:for (let factor = 2; factor < candidate; factor++)
for (let factor = 2; !(factor >= candidate); factor++)Explicação: factor < candidate é equivalente a !(factor >= candidate). O NOT inverte a condição original, mantendo a mesma lógica.
- Enunciado: Escreva uma estrutura de loop que imprima todos os fatores inteiros de um determinado número
my_number.
let my_number = 36; for (let factor = 2; factor <= my_number; factor++) { if (my_number % factor == 0) { console.log(factor, "is an integer factor of", my_number); } }Explicação: O loop testa cada número de 2 até my_number. Se o resto da divisão for zero (%), o número é um fator inteiro e é impresso no console.