Como passar em uma entrevista de JavaScript: principais perguntas
A entrevista para a posição de desenvolvedor JavaScript não é apenas uma verificação de sintaxe, mas também um entendimento profundo de como a linguagem funciona. Isso é especialmente verdadeiro para Node.js, onde a assincronicidade e o tratamento de erros ganham destaque. Neste artigo, analisamos as 10 principais perguntas que são mais frequentemente feitas em entrevistas para desenvolvedores Junior e Middle. Cada pergunta é acompanhada por um exemplo de código e uma explicação.
1. O que é closure e onde é aplicado?
Closure é uma função que "lembra" seu escopo léxico mesmo após a função externa ter concluído sua execução. Este é um dos conceitos-chave do JavaScript.
Exemplo:
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2Onde é aplicado? Em módulos, fábricas de funções, memoização, manipuladores de eventos e ao trabalhar com closures em loops (por exemplo, em setTimeout).
2. Como funciona o Event Loop no Node.js?
O Event Loop é um mecanismo que permite ao Node.js executar operações não bloqueantes, apesar de ser single-thread. Ele consiste em várias fases: timers, poll, check e close callbacks.
Exemplo com microtasks:
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Saída: 1, 4, 3, 2Por que isso acontece? As microtasks (Promise) são executadas imediatamente após a pilha atual e antes da próxima fase do Event Loop.
3. Diferença entre == e ===
O operador == compara valores com coerção de tipos, enquanto === compara sem coerção (igualdade estrita).
console.log(5 == '5'); // true (coerção de string para número)console.log(5 === '5'); // false (tipos diferentes)console.log(null == undefined); // trueconsole.log(null === undefined); // falseEm entrevistas, é comum pedirem para explicar por que [] == false resulta em true (devido à comparação abstrata com primitivo).
4. O que é herança prototípica?
Em JavaScript, objetos podem herdar propriedades de outros objetos através da cadeia de protótipos. Cada objeto possui uma propriedade interna [[Prototype]], que pode ser acessada via __proto__ ou Object.getPrototypeOf().
Exemplo:
const animal = { eats: true };const rabbit = { jumps: true };
rabbit.__proto__ = animal;
console.log(rabbit.eats); // true (herdado)console.log(rabbit.jumps); // trueA forma moderna é usar Object.create() ou classes (açúcar sintático sobre protótipos).
5. Como funciona o this em JavaScript?
O valor de this é determinado pelo contexto de chamada da função. As regras principais são:
- No contexto global (no navegador) —
window, no Node.js —global. - Em um método de objeto — o próprio objeto.
- Em uma arrow function —
thisléxico (da função externa). - Ao chamar via
call/apply/bind— o contexto explicitamente passado.
Exemplo:
const obj = { name: 'Alice', greet: function() { console.log(this.name); }};
obj.greet(); // Alice
const greet = obj.greet;greet(); // undefined (perda de contexto)
const boundGreet = obj.greet.bind({ name: 'Bob' });boundGreet(); // Bob