20 perguntas · JavaScript
Perguntas de entrevista para Desenvolvedor JavaScript
Perguntas sobre closures, event loop, código assíncrono, protótipos e os bugs que só aparecem em código de verdade. Servem para separar quem recita definições de quem entende como a linguagem roda.
JavaScript é fácil de escrever e difícil de dominar, o que torna a entrevista traiçoeira. Quase qualquer candidato consegue entregar uma funcionalidade que funciona. A pergunta que importa é se a pessoa entende as partes da linguagem que geram bugs silenciosos: closures capturando a variável errada, o event loop reordenando um código que parece sequencial, o this mudando conforme a função é chamada e a coerção de tipos fazendo algo inesperado.
Um bom desenvolvedor JavaScript não é quem decorou que “JavaScript é single-threaded”. É quem consegue explicar por que um await dentro de um loop serializa as requisições, por que um await esquecido engole um erro ou por que dois objetos com o mesmo conteúdo não são iguais. As perguntas abaixo vão da mecânica da linguagem para o comportamento assíncrono e depois para a depuração prática, porque é nessa ordem que a senioridade aparece.
Combine duas perguntas de fundamentos com um cenário assíncrono e uma história real de depuração, e você logo vai saber se a pessoa já entregou JavaScript sob pressão ou só estudou a teoria. Preste atenção especial em quem recorre a um exemplo pequeno e concreto para explicar um conceito abstrato: esse hábito é um dos sinais mais confiáveis de fluência.
Fundamentos da linguagem6 perguntas
O que é uma closure? Me dê um exemplo concreto em que você usou uma de propósito.
O que observar: Uma função que lembra o escopo onde foi criada, com um uso real, como uma factory, um contador privado, um debounce ou um handler que guarda contexto.
Explique a diferença entre var, let e const, e o que o hoisting faz com cada um.
O que observar: Escopo de função versus escopo de bloco, a temporal dead zone de let e const e o fato de que const impede a reatribuição, mas não a mutação do objeto.
Como o valor de this muda conforme a forma como a função é chamada?
O que observar: Chamada como método, chamada solta, com new, com call, apply ou bind e dentro de arrow functions, que herdam o this de fora. Um exemplo de bug real é ótimo sinal.
Me explique a cadeia de protótipos do JavaScript. O que acontece quando você acessa uma propriedade que não está no próprio objeto?
O que observar: A busca subindo pelo __proto__ até o null, e a noção de que class é açúcar sintático sobre protótipos.
Qual é a diferença entre == e ===, e você consegue citar um caso de coerção que surpreende as pessoas?
O que observar: Igualdade com e sem coerção, um exemplo como 0 == "" ou null == undefined, e o hábito de usar === por padrão.
Qual é a diferença entre null e undefined, e quando cada um aparece na prática?
O que observar: O undefined como ausência de valor atribuído (parâmetro não passado, propriedade inexistente) e null como ausência intencional, com cuidado ao tratar os dois.
Assincronia e event loop5 perguntas
Explique o event loop. Por que o JavaScript consegue fazer I/O não bloqueante rodando numa única thread?
O que observar: A call stack, as filas de tarefas e o ambiente (navegador ou Node) cuidando do I/O, com o loop despachando callbacks quando a pilha esvazia.
Qual é a diferença entre a fila de microtasks e a de macrotasks, e por que uma Promise resolve antes de um setTimeout de 0?
O que observar: Que as microtasks (Promises) são drenadas por completo antes da próxima macrotask (timers, eventos), com a ordem de execução correta.
Que problema as Promises resolvem em relação aos callbacks, e o que o async/await acrescenta?
O que observar: Composição e tratamento de erro centralizado no lugar do callback hell, e o async/await como sintaxe mais legível sobre as mesmas Promises.
Você faz await de várias chamadas de API independentes dentro de um for e está lento. O que está acontecendo e como corrigir?
O que observar: Que as chamadas estão em série, e a correção com Promise.all ou Promise.allSettled, de preferência com um limite de concorrência quando são muitas.
Como você trata erros em código com async/await, e o que acontece com uma Promise rejeitada que ninguém trata?
O que observar: Um try/catch em volta do await, atenção ao await esquecido e o evento de unhandled rejection, que no Node pode derrubar o processo.
ES6+ e DOM4 perguntas
O que a desestruturação oferece, e quando os valores padrão dentro dela de fato se aplicam?
O que observar: Que o valor padrão só entra quando o valor é undefined, e não quando é null, um detalhe que pega muita gente.
Explique a diferença entre uma arrow function e uma função comum, além da sintaxe.
O que observar: This e arguments léxicos, a impossibilidade de usar com new e a consequência disso em métodos de objeto e handlers de evento.
O que é delegação de eventos e por que ela é útil ao lidar com uma lista longa?
O que observar: Um único listener no elemento pai aproveitando o bubbling, com event.target para identificar o item. Funciona inclusive para itens adicionados depois.
Qual é a diferença entre map, filter e reduce, e quando você usaria reduce?
O que observar: Transformar, filtrar e acumular, com um uso legítimo de reduce (agrupar, somar) e o bom senso de não usá-lo quando map ou filter deixam o código mais claro.
Depuração e julgamento5 perguntas
Me conte sobre um bug de JavaScript que levou muito tempo para ser encontrado. Como você finalmente chegou nele?
O que observar: Uma história concreta, com hipóteses, ferramentas (DevTools, breakpoints, logs) e a causa raiz, que muitas vezes envolve tempo, closures ou mutação.
Um valor está undefined quando você esperava que estivesse preenchido. Como você investiga?
O que observar: Um método: reproduzir, seguir o dado da origem até o uso, checar timing assíncrono e nomes de propriedades, em vez de espalhar console.log aleatórios.
Como você decide entre mutar um estado e criar uma cópia nova, e por que isso importa?
O que observar: Efeitos colaterais e referências compartilhadas, a importância da imutabilidade para frameworks que comparam por referência e a diferença entre cópia rasa e profunda.
Como você procuraria um vazamento de memória numa SPA que fica aberta por muito tempo?
O que observar: Heap snapshots no DevTools e suspeitos comuns: listeners não removidos, timers esquecidos, caches que só crescem e referências presas em closures.
Um colega escreve um código que funciona, mas que você acha difícil de ler. Como você lida com isso no code review?
O que observar: Feedback específico e respeitoso, com sugestão concreta, separando gosto pessoal de problema real de manutenção.
Dicas para a entrevista de Desenvolvedor JavaScript
- Valorize quem explica um conceito com um exemplo pequeno e concreto. É o sinal mais claro de fluência real.
- Aprofunde a parte assíncrona: a maioria dos bugs de JavaScript em produção mora no timing e nas rejeições não tratadas.
- Não penalize quem esquece o nome exato de um método de array se o raciocínio estiver correto.
- Peça uma história real de depuração. A forma como a pessoa estreita um bug diz mais do que qualquer definição.
- Fique de olho no excesso de engenharia. Bons desenvolvedores JavaScript usam a solução mais simples que funciona.
FAQ
Perguntas frequentes
Quantas perguntas de JavaScript fazer numa entrevista?
De seis a oito num horário de 45 a 60 minutos. Aprofundar closures, event loop e uma história de depuração rende mais do que correr por vinte definições rasas.
Devo avaliar o framework ou o JavaScript puro?
Avalie primeiro o JavaScript puro. Quem entende closures, assincronia e protótipos aprende qualquer framework rápido; o contrário raramente acontece.
Vale fazer um exercício de programação ao vivo para vagas de JavaScript?
Vale, desde que seja curto e realista, como corrigir um bug ou montar um pequeno fluxo assíncrono. Isso revela muito mais do que quebra-cabeças de algoritmo. Combine com as perguntas de discussão para avaliar julgamento.
Como diferenciar uma resposta júnior de uma sênior em JavaScript?
O júnior descreve o que um recurso faz. O sênior explica quando ele morde, como a lentidão do await dentro do loop, a rejeição engolida ou a closure com valor antigo, e cita bugs que de fato corrigiu.
Como fazer a triagem de candidatos JavaScript antes da entrevista?
Use um teste de habilidades curto ou perguntas de triagem na candidatura para filtrar quem entende de verdade a linguagem e a parte assíncrona antes de gastar tempo de entrevista. Na Hireaan, os testes são corrigidos pela IA e os candidatos aparecem ranqueados por aderência à vaga.
Mais bancos de perguntas de entrevista
- Node.jsPerguntas para Desenvolvedor Node.jsSaiba mais
- PHP / LaravelPerguntas para Desenvolvedor PHP / LaravelSaiba mais
- Python júniorPerguntas para Desenvolvedor Python júniorSaiba mais
- Python sêniorPerguntas para Desenvolvedor Python sêniorSaiba mais
- QAPerguntas para Analista de QA e automação de testesSaiba mais
- ReactPerguntas para Desenvolvedor ReactSaiba mais
Abriu a vaga de Desenvolvedor JavaScript? Rode o processo na Hireaan.
A IA ranqueia os candidatos, você agenda as entrevistas, aplica testes de habilidades e envia a proposta, com um preço fixo para o time inteiro.
- 14 dias grátis
- Sem cartão de crédito
- Cancele quando quiser
- Conforme a LGPD
