P
prepair.app
Começar entrevista →
EnglishУкраїнськаРусскийDeutsch
🟨

Perguntas de entrevista JavaScript

As entrevistas de JavaScript se concentram em um pequeno número de coisas que a linguagem faz diferente de tudo mais: closures, `this`, protótipos e o event loop. Entenda bem isso e a maioria das outras perguntas se resolve sozinha. Aqui estão as mais frequentes, cada uma com uma resposta modelo.

Junior · sem experiência / menos de 1 anoMiddle · 2–4 anos de experiênciaSenior · 5+ anos de experiência

O que perguntam

Tipos e coerção
Closures e escopo
`this` e protótipos
O event loop e async
Promises e async/await
DOM, eventos e o navegador

10 perguntas reais com respostas

Cada pergunta vem com uma resposta modelo para você comparar com a sua.

1

Quais tipos de dados existem em JavaScript?

Resposta

Sete primitivos — string, number, boolean, null, undefined, symbol, bigint — e tudo o mais é um objeto, incluindo arrays e funções. Primitivos são copiados por valor e objetos por referência, que é a origem da maior parte da confusão sobre por que mudar uma variável mudou outra. typeof null retorna 'object', e esse é um bug de 1995 que nunca pode ser corrigido sem quebrar a web.

2

Qual é a diferença entre `var`, `let` e `const`?

Resposta

var tem escopo de função e é hoisted como undefined; let e const têm escopo de bloco e ficam na zona morta temporal até a declaração, então acessá-las antes lança um erro em vez de dar undefined silenciosamente. const impede reatribuir a variável, não mutar o objeto para o qual ela aponta — const arr = [] ainda permite arr.push(). Use const por padrão, let quando precisar reatribuir, e nunca var.

3

Qual é a diferença entre `==` e `===`?

Resposta

=== compara tipo e valor; == coage primeiro, seguindo regras que fazem null == undefined ser verdadeiro enquanto null == 0 é falso. Como quase ninguém lembra a tabela inteira, a regra prática é sempre usar ===. A única exceção defensável é x == null como forma curta de checar tanto null quanto undefined.

4

O que é um closure?

Resposta

Uma função junto com o escopo em que foi criada, ao qual mantém acesso mesmo depois que a função externa retornou. É o que torna possível estado privado, funções factory e hooks — a função interna guarda uma referência viva, não uma cópia. A pegadinha clássica de entrevista é um var num loop com setTimeout, onde todos os callbacks compartilham um binding e imprimem o mesmo valor; let dá a cada iteração o seu próprio.

5

O que é `this` e como ele é determinado?

Resposta

Pela forma como a função é chamada, não por onde é definida. Chamada como método, this é o objeto antes do ponto; chamada de forma solta, é undefined em modo estrito; chamada com new, é o novo objeto; e call, apply e bind o fixam explicitamente. Arrow functions não têm this próprio e o pegam do escopo que as contém, que é exatamente por que resolveram o problema dos callbacks e exatamente por que são erradas como métodos de objeto.

6

Como funciona a herança prototípica?

Resposta

Todo objeto tem um vínculo oculto com outro objeto, seu protótipo. Quando você lê uma propriedade que não está lá, a engine percorre essa cadeia até encontrá-la ou chegar a null. class é sintaxe sobre isso — cria uma função construtora cujo objeto prototype guarda os métodos, então todas as instâncias compartilham uma cópia de cada método em vez de cada uma carregar a sua.

7

Explique o event loop, macrotasks e microtasks.

Resposta

JavaScript roda numa única thread com uma fila. Quando o call stack esvazia, o loop esvazia toda a fila de microtasks — callbacks de promises, queueMicrotask, MutationObserver — e só então pega uma macrotask, como um callback de setTimeout ou um evento. É por isso que um .then sempre roda antes de um setTimeout(0) agendado antes dele, e por isso uma cadeia interminável de microtasks pode bloquear a renderização por completo.

8

Qual é a diferença entre `Promise.all` e `Promise.allSettled`?

Resposta

all rejeita assim que qualquer promise rejeita e não te dá nada do resto; allSettled sempre resolve com um status por promise. Use all quando a operação inteira não faz sentido se uma parte falhar, allSettled quando você quer relatar quais partes falharam. E note a diferença com awaits sequenciais num loop — esses rodam um atrás do outro, o que costuma ser um bug de performance acidental.

9

Qual é a diferença entre uma cópia rasa e uma profunda?

Resposta

Uma cópia rasa — spread ou Object.assign — copia o nível superior, então objetos aninhados continuam compartilhados e mutá-los afeta o original. Uma cópia profunda duplica a árvore inteira; structuredClone faz isso nativamente e lida com ciclos, Map e Date, enquanto o velho truque JSON.parse(JSON.stringify(x)) descarta silenciosamente funções, undefined e tipos Date.

10

Qual é a diferença entre uma arrow function e uma normal?

Resposta

Uma arrow function não tem this, não tem arguments, não tem prototype, e não pode ser chamada com new. Ela pega this lexicamente de onde foi definida, o que a torna certa para callbacks e errada para métodos de objeto e métodos de protótipo. Também não pode ser usada como construtora ou gerador.

🦎

Só ler as respostas não basta

Numa entrevista de verdade você fala sob pressão. O Cam faz essas mesmas perguntas, avalia cada resposta e mostra exatamente o que melhorar.

Praticar entrevista de JavaScript →
Grátis · 3 entrevistas por mês

Vale a pena ler

Todos os artigos →

Outras especializações

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing