Não explica a fundo — lista o que você tem que saber

JavaScript Essencial

Um checklist dos fundamentos de JavaScript moderno: cada tópico em poucas linhas, com o snippet mínimo e as armadilhas. Se ao ler algo você sentir que não domina, o ponteiro → aprofunde em… indica a apostila completa. Serve de revisão pré-entrevista, de mapa para quem está começando, e de referência rápida no dia a dia.

10 seções + recaptipos · escopo · this · asyncarmadilhas destacadasauto-checagem por seçãocross-references
COMO USAR

O formato "Essencial"

Uma apostila-checklist: densa, sem rodeios, feita para ser varrida — não lida linha a linha.

01

Tipos, valores e coerção

7 primitivos + objeto. Tudo que não é primitivo é objeto (incluindo array e função). → aprofunde em JavaScript Fullstack

PrimitivoNotas
stringImutável. Aspas ou template literal `...${x}...`
numberUm só tipo (float 64). 0.1+0.2 !== 0.3. NaN, Infinity
bigint10n — inteiros grandes exatos
booleantrue/false
undefined"não foi atribuído" (default de variável/param/retorno)
null"ausência intencional" (você põe). typeof null === "object" (bug histórico)
symbolIdentificador único; chaves não-colidentes

Checagem e igualdade

typeof x               // "string" | "number" | ... | "object" | "function" | "undefined"
Array.isArray(x)       // typeof [] é "object" — use isso p/ array
x === y                // SEMPRE. Sem coerção.
x == y                 // coage — evite. Exceção comum: x == null pega null E undefined
Number.isNaN(x)        // NaN !== NaN — a única forma correta de testar NaN
Object.is(x, y)        // como === mas Object.is(NaN,NaN)===true e -0 !== +0

Truthy / falsy

Falsy (só estes 8): false, 0, -0, 0n, "", null, undefined, NaN. Todo o resto é truthy — incluindo "0", "false", [], {}.

⚠️ Armadilhas
  • if (x) quando x pode ser 0 ou "" válido → use if (x != null) ou x !== undefined.
  • Somar string com número coage: 1 + "2" === "12", mas 1 - "2" === -1.
  • [] == ![] é true — é por isso que não se usa ==.
  • Primitivos são copiados por valor; objetos/arrays/funções são copiados por referência.
✔️ Auto-checagem

Quais os 8 valores falsy? Por que [] == false? Como testar NaN? Diferença entre null e undefined na prática? typeof de [], de null, de uma função?

02

Variáveis, escopo e closures

const por padrão, let quando reatribui, var nunca. → aprofunde em JavaScript Fullstack

EscopoHoistingReatribui?
constbloco { }TDZ (erro se usar antes)não (o binding; o objeto ainda muta por dentro)
letbloco { }TDZsim
varfunção (ignora blocos)sobe como undefinedsim — legado, evite

Closure

Uma função "lembra" as variáveis do escopo onde foi criada, mesmo depois que esse escopo terminou.

function contador() {
  let n = 0;
  return () => ++n;   // esta arrow fecha sobre `n`
}
const next = contador();
next(); next();          // 1, 2 — `n` sobrevive, privado

Usos: estado privado, memoização, factories, handlers que capturam contexto.

⚠️ Armadilhas
  • Loop com var + callback assíncrono → todos veem o último valor. Com let, cada iteração tem seu binding.
  • Closure capturando um objeto grande num handler que nunca é removido = memory leak (→ DevTools & Debug, Módulo 6).
  • const obj = {...} não impede obj.x = 1. Para congelar: Object.freeze(obj) (raso).
✔️ Auto-checagem

O que é TDZ? Por que let no for resolve o clássico "todos imprimem 3"? Escreva uma factory que retorna funções com estado privado. const torna o valor imutável?

03

Funções e this

Funções são valores (first-class). Arrow ≠ function quanto a this. → aprofunde em JavaScript Fullstack

function f(a, b = 1, ...rest) { }   // default + rest params
const g = (a, b) => a + b;           // arrow: retorno implícito, sem { }
const h = a => ({ a });               // retornar objeto: parênteses
(function(){ ... })();               // IIFE

As 4 regras de this (para function, resolvido na CHAMADA)

Chamadathis é
obj.metodo()obj (o objeto à esquerda do ponto)
fn() avulsaundefined (strict) / window (sloppy)
new Fn()o objeto novo criado
fn.call(x) / .apply(x) / .bind(x)x (explícito)

Arrow function: não tem this próprio — usa o do escopo onde foi definida (lexical). Também não tem arguments, não serve de construtor, não tem prototype.

⚠️ Armadilhas
  • Passar obj.metodo como callback "perde" o thisobj.metodo.bind(obj) ou () => obj.metodo().
  • Método de objeto como arrowthis não é o objeto (é o de fora). Use function/method shorthand para métodos.
  • Handler de evento com arrow: this não é o elemento; use e.currentTarget.
  • arguments não é array de verdade → [...arguments] ou use rest ...args.
✔️ Auto-checagem

As 4 regras de this. Por que arrow "conserta" o this em callbacks? Quando NÃO usar arrow? Diferença entre call, apply e bind?

04

Objetos e arrays

Destructuring, spread, optional chaining e nullish são o vocabulário do dia a dia. → aprofunde em JavaScript Fullstack

// literal + shorthand + computed key
const nome = "Ana", chave = "id";
const u = { nome, [chave]: 1, saudar() { return `Oi, ${this.nome}` } };

// destructuring (com default e rename)
const { nome: n, idade = 0, ...resto } = u;
const [primeiro, , terceiro] = arr;
function f({ a, b = 10 }) { }         // destructuring em parâmetro

// spread (cópia RASA) e merge
const copia = { ...u, idade: 30 };       // último vence
const arr2 = [...a, ...b, 99];

// acesso seguro
u?.endereco?.rua               // undefined se algo no caminho for null/undefined
u.telefone ?? "sem tel"          // fallback SÓ se null/undefined (não se 0 ou "")
u.lista?.[0]                   // optional chaining com índice
minhaFn?.()                   // chama só se existir

Utilitários de objeto

Object.keys(o) / .values(o) / .entries(o)   // arrays
Object.assign(alvo, ...fontes)               // merge raso (muta alvo)
Object.freeze(o)                             // imutável raso
structuredClone(o)                           // cópia PROFUNDA (moderno)
JSON.parse(JSON.stringify(o))                // cópia profunda antiga (perde Date, undefined, fn...)
"x" in o  /  o.hasOwnProperty("x")  /  Object.hasOwn(o, "x")
⚠️ Armadilhas
  • Spread e Object.assign são rasos: objetos aninhados continuam compartilhados. Para profundo: structuredClone.
  • { ...a, ...b }: chaves de b sobrescrevem a.
  • ?? vs ||: 0 || 5 é 5 (bug); 0 ?? 5 é 0 (correto para "valor default só se ausente").
  • Comparar objetos com === compara referência, não conteúdo.
  • Ordem de chaves: inteiras primeiro (ascendente), depois strings na ordem de inserção.
✔️ Auto-checagem

Diferença entre ?? e ||. Como copiar profundamente um objeto? Destructure {a, b: {c}} com default para c. O que ?. retorna quando o caminho quebra?

05

Métodos de array

Prefira os que não mutam e retornam novo array. → aprofunde em JavaScript Fullstack · Algoritmos com Python (conceitos de complexidade)

MétodoRetornaNota
map(fn)novo array, mesmo tamanhotransformar
filter(fn)novo array, ≤ tamanhofn retorna boolean
reduce(fn, init)um valor acumuladosempre passe init
find(fn) / findIndex(fn)1º elemento / índice, ou undefined/-1para no 1º match
some(fn) / every(fn)boolean"existe algum" / "todos"
includes(v) / indexOf(v)boolean / índiceincludes acha NaN
flatMap(fn) / flat(d)novo array achatado 1 nível
forEach(fn)undefinedsó efeito colateral; não dá para break
slice(i, j)novo array (fatia)não muta
sort(fn) · reverse() · splice() · push/pop/shift/unshift · fillMUTAM o original
toSorted · toReversed · toSpliced · withnovo arrayversões imutáveis (ES2023)
// encadeamento típico
const total = pedidos
  .filter(p => p.pago)
  .map(p => p.valor)
  .reduce((s, v) => s + v, 0);

// iterar: for...of dá break/continue e await; forEach não
for (const item of lista) { if (cond) break; }
⚠️ Armadilhas
  • sort() sem comparador ordena como string: [10, 2, 1].sort()[1, 10, 2]. Use sort((a,b) => a - b). E sort muta.
  • reduce sem valor inicial num array vazio → erro.
  • forEach ignora return, não espera await, não dá break. Para async sequencial: for...of + await.
  • map só para transformar; se você não usa o retorno, era for...of/forEach.
  • Métodos que mutam num state de React/Vue = bug de reatividade. Use spread ou toSorted/with.
✔️ Auto-checagem

Quais métodos mutam? Por que [3,20,1].sort()[1,20,3]? Quando for...of em vez de forEach? Escreva um reduce que agrupa por chave.

06

Assíncrono: event loop, Promises, async/await

JS é single-thread: o assíncrono não é paralelismo, é agendamento. → aprofunde em JavaScript Fullstack · Next.js (RSC/streaming)

Event loop em uma frase

A stack roda até esvaziar; então processa todas as microtasks (Promises, queueMicrotask); depois uma macrotask (timer, evento, I/O); repete. Por isso Promise.then roda antes de setTimeout(…, 0).

const p = new Promise((resolve, reject) => { ... });   // pending → fulfilled | rejected
p.then(v => ...).catch(e => ...).finally(() => ...);

async function f() {
  try {
    const a = await fetch(url);           // pausa a função, não a thread
    const data = await a.json();
    return data;                        // async sempre retorna Promise
  } catch (e) { ... }                    // pega rejeições dos await
}

Combinadores

Resolve quandoRejeita quando
Promise.all([...])todas resolvem → array de valoresa 1ª que rejeitar (as outras continuam rodando)
Promise.allSettled([...])todas terminam → {status, value/reason}[]nunca
Promise.race([...])a 1ª a resolvera 1ª a rejeitar
Promise.any([...])a 1ª a resolversó se todas rejeitarem (AggregateError)
// paralelo (as 3 disparam juntas):
const [a, b, c] = await Promise.all([getA(), getB(), getC()]);
// sequencial (uma espera a outra) — só se houver dependência:
for (const id of ids) { await processar(id); }
⚠️ Armadilhas
  • Esquecer await → você tem uma Promise pendente, não o valor; e a rejeição vira unhandled.
  • array.forEach(async …) não espera nada. Use for...of + await, ou Promise.all(array.map(async …)).
  • await dentro de map sem Promise.all não serializa — cada callback é independente.
  • Promise.all falha tudo no 1º erro; se você quer os resultados parciais, allSettled.
  • Erro dentro de um .then sem .catch depois → unhandled rejection.
  • Loop pesado síncrono trava a UI inteira — não há await que ajude; quebre o trabalho.
✔️ Auto-checagem

Por que then roda antes de setTimeout(0)? Qual a diferença entre all e allSettled? Como disparar 3 fetches em paralelo e esperar todos? Por que forEach(async) não funciona como esperado?

07

Classes e protótipos

class é açúcar sobre a cadeia de protótipos. → aprofunde em JavaScript Fullstack

class Animal {
  #energia = 100;                 // campo privado (só dentro da classe)
  static reino = "Animalia";      // na classe, não na instância
  constructor(nome) { this.nome = nome; }
  mover() { this.#energia--; }
  get vivo() { return this.#energia > 0; }   // getter: acessa como propriedade
}
class Gato extends Animal {
  constructor(nome) { super(nome); }        // super() antes de usar this
  mover() { super.mover(); console.log("miau"); }
}
const g = new Gato("Tom");
g instanceof Animal;   // true

Por baixo

⚠️ Armadilhas
  • Usar this antes de super() na subclasse → erro.
  • Passar g.mover como callback perde o this (seção 03). Solução: campo de classe com arrow (mover = () => {...}) ou bind no constructor.
  • #privado é privado de verdade (não é convenção como _x).
  • Herança profunda quase sempre é sinal de design ruim — prefira composição.
✔️ Auto-checagem

O que class "esconde"? Por que super() antes de this? Diferença entre método (no prototype) e campo de instância. O que instanceof checa?

08

Módulos

ESM (import/export) é o padrão. → aprofunde em JavaScript Fullstack · Next.js

// export
export const PI = 3.14;              // named
export function soma(a, b) {}       // named
export default class Cliente {}     // default (um por arquivo)
export { a, b as bee };              // lista / rename

// import
import Cliente, { PI, soma } from "./mod.js";
import * as mod from "./mod.js";
const m = await import("./pesado.js");   // dinâmico → code splitting
ESMCommonJS (Node legado)
Sintaxeimport / exportrequire() / module.exports
Carregamentoestático, assíncrono, top-level awaitsíncrono
Tree-shakingsim (imports estáticos)não
Ativar"type": "module" ou .mjs; padrão em bundlers/browserpadrão antigo do Node
⚠️ Armadilhas
  • Não misture require e import no mesmo arquivo sem entender o interop.
  • Bindings de ESM são vivos e read-only: você não reatribui um import.
  • Ciclos de import podem dar undefined temporário — evite dependência circular.
  • import() dinâmico é como você faz lazy load de rotas/componentes.
✔️ Auto-checagem

Named vs default export — quando cada um? Por que ESM permite tree-shaking e CJS não? Como fazer lazy load de um módulo? O que import * as traz?

09

Erros e robustez

Trate a falha onde você pode decidir algo; senão, propague. → aprofunde em JavaScript Fullstack · DevTools & Debug

try {
  arriscado();
} catch (e) {
  if (e instanceof TypeError) { ... }
  throw new Error(`ao processar: ${e.message}`, { cause: e });  // re-lança com contexto
} finally {
  limpar();   // sempre roda
}

class ValidationError extends Error {
  constructor(campo) { super(`inválido: ${campo}`); this.name = "ValidationError"; this.campo = campo; }
}
⚠️ Armadilhas
  • catch vazio ou catch (e) { console.log(e) } e seguir como se nada = engolir o erro.
  • Promise rejeitada sem .catch/try` → unhandled rejection (crash no Node moderno).
  • try/catch não pega erro dentro de um setTimeout/callback assíncrono não-await.
  • Não use exceções para fluxo normal (ex.: "não encontrado" pode ser um valor de retorno).
✔️ Auto-checagem

Quando finally roda? Como criar um erro custom? Como capturar a rejeição de um await? O que é Error.cause? Por que nunca throw "string"?

10

O resto do essencial

Itens que caem e você tem que reconhecer. → aprofunde em JavaScript Fullstack · DevTools & Debug · Next.js

TópicoO mínimo
Map / SetMap: chaves de qualquer tipo, ordem de inserção, .get/.set/.has/.size. Set: valores únicos — [...new Set(arr)] deduplica
JSONJSON.stringify(o, null, 2) / JSON.parse. Perde undefined, funções, Date vira string, Map/Set viram {}. Lança em ciclo
Template literals`${expr}`, multilinha, tagged templates
Iteradores / geradoresProtocolo Symbol.iterator (o que for...of/spread usam). function* + yield gera valores sob demanda
Regex/padrão/flags · str.match/matchAll/replace/replaceAll · flags g i m s u. Grupos nomeados (?<ano>\d{4})
DatasDate é ruim; use Intl.DateTimeFormat/Intl.NumberFormat para exibir, ou Temporal (novo) / date-fns / Day.js
NúmerosNumber.isInteger, toFixed (retorna string!), parseInt(x, 10) (sempre a base), Math.round/floor/ceil/trunc
Stringstrim, padStart, split, slice, at(-1), includes, replaceAll
MutabilidadeEm frameworks reativos: nunca mutar state — sempre criar novo (spread, toSorted, with)
Strict modeMódulos e classes já são strict. Pega erros silenciosos
DOM (1 frase)document.querySelector, el.addEventListener, el.textContent/classList/dataset. Nunca innerHTML com dado do usuário (XSS). Depurar: → DevTools & Debug
Node vs browserSem window/document no Node; sem require/fs no browser. fetch existe nos dois hoje
TypeScriptÉ JS + tipos. Se o projeto é sério, provavelmente é TS. → Full Stack com TypeScript & Next.js
✔️ Auto-checagem

Como deduplicar um array? O que JSON.stringify perde? Diferença entre Map e objeto simples. O que é XSS e como o innerHTML se relaciona? Por que parseInt(x) pode surpreender sem a base?

RECAP

Checklist final dos fundamentos de JavaScript

Se você marca todos de cabeça, tem o básico. Onde travar, volte à seção — e à apostila completa se a dúvida for de fundo.

✅ Eu sei…
  • os 7 primitivos, os 8 valores falsy, e por que === sempre
  • testar NaN corretamente e a diferença null / undefined
  • usar const/let, o que é TDZ, e nunca usar var
  • explicar e escrever uma closure com estado privado
  • as 4 regras de this e por que arrow não tem this próprio
  • destructuring, spread/rest, ?. e ?? (e por que ??||)
  • que spread/assign são rasos e usar structuredClone para profundo
  • map/filter/reduce/find/some/every e quais métodos mutam
  • que sort() sem comparador ordena como string e muta
  • quando usar for...of em vez de forEach (break, await)
  • o event loop (microtask vs macrotask) em uma frase
  • Promise, async/await, try/catch em async
  • Promise.all vs allSettled vs race vs any; paralelo vs sequencial
  • por que forEach(async …) não espera nada
  • class, extends/super, #privado, static, getters — e que é açúcar de protótipo
  • import/export (named vs default), ESM vs CJS, import() dinâmico
  • lançar Error (nunca string), erro custom, Error.cause, finally
  • o perigo de engolir erro e de unhandled rejection
  • Map/Set, o que JSON.stringify perde, template literals
  • não mutar state em framework reativo; não pôr dado do usuário em innerHTML

Aprofundamento por tema: JavaScript Fullstack (linguagem completa, DOM, ferramentas) · Full Stack com TypeScript & Next.js (tipos, React Server Components) · Next.js · DevTools & Debug (inspeção e profiling) · Aceleração de Código com IA (fluxo assistido).