Comment réussir un entretien JavaScript : les questions les plus fréquentes
Un entretien pour un poste de développeur JavaScript ne consiste pas seulement à vérifier la syntaxe, mais aussi à comprendre en profondeur le fonctionnement du langage. Cela est particulièrement vrai pour Node.js, où l'asynchronisme et la gestion des erreurs sont primordiaux. Dans cet article, nous avons analysé le top 10 des questions les plus souvent posées lors des entretiens pour les développeurs Junior et Middle. Chaque question est accompagnée d'un exemple de code et d'une explication.
1. Qu'est-ce qu'une fermeture (closure) et où est-elle utilisée ?
Une fermeture est une fonction qui « se souvient » de sa portée lexicale même après que la fonction externe a terminé son exécution. C'est l'un des concepts clés de JavaScript.
Exemple :
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2Où est-ce utilisé ? Dans les modules, les fabriques de fonctions, la mémorisation, les gestionnaires d'événements et lors du travail avec des fermetures dans des boucles (par exemple, dans setTimeout).
2. Comment fonctionne la boucle d'événements (Event Loop) dans Node.js ?
La boucle d'événements est le mécanisme qui permet à Node.js d'effectuer des opérations non bloquantes malgré son modèle monothread. Elle se compose de plusieurs phases : timers, poll, check et close callbacks.
Exemple avec des microtâches :
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Affichage : 1, 4, 3, 2Pourquoi cela ? Les microtâches (Promise) sont exécutées immédiatement après la pile actuelle et avant la phase suivante de la boucle d'événements.
3. Différence entre == et ===
L'opérateur == compare les valeurs avec conversion de type, tandis que === compare sans conversion (égalité stricte).
console.log(5 == '5'); // true (conversion de la chaîne en nombre)console.log(5 === '5'); // false (types différents)console.log(null == undefined); // trueconsole.log(null === undefined); // falseLors des entretiens, on demande souvent d'expliquer pourquoi [] == false donne true (à cause de la comparaison abstraite avec un primitif).
4. Qu'est-ce que l'héritage prototypal ?
En JavaScript, les objets peuvent hériter des propriétés d'autres objets via la chaîne de prototypes. Chaque objet possède une propriété interne [[Prototype]], accessible via __proto__ ou Object.getPrototypeOf().
Exemple :
const animal = { eats: true };const rabbit = { jumps: true };
rabbit.__proto__ = animal;
console.log(rabbit.eats); // true (hérité)console.log(rabbit.jumps); // trueLa méthode moderne consiste à utiliser Object.create() ou les classes (sucre syntaxique au-dessus des prototypes).
5. Comment fonctionne this en JavaScript ?
La valeur de this est déterminée par le contexte d'appel de la fonction. Les règles principales :
- Dans le contexte global (dans le navigateur) —
window, dans Node.js —global. - Dans une méthode d'objet — l'objet lui-même.
- Dans une fonction fléchée —
thislexical (de la fonction externe). - Lors de l'appel via
call/apply/bind— le contexte explicitement passé.
Exemple :
const obj = { name: 'Alice', greet: function() { console.log(this.name); }};
obj.greet(); // Alice
const greet = obj.greet;greet(); // undefined (perte du contexte)
const boundGreet = obj.greet.bind({ name: 'Bob' });boundGreet(); // Bob