Javascript
Junior
Quiz-Javascript-Junior
Javascript-Closures
Javascript-Hoisting
Javascript-Dom
Async-Await
Promises
Questions-Entretien-Javascript
Qcm-Javascript-Junior
Tableaux-Js
Revision-Javascript
Front-End
Es6
📝
Entretien JavaScript Junior — Closures, DOM et Async
20 questions JavaScript niveau junior : closures, hoisting, manipulation du DOM, promesses, async/await et méthodes avancées des tableaux (map, filter, reduce). Préparez un entretien Junior.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « Entretien JavaScript Junior — Closures, DOM et Async », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
C'est un bug historique de JavaScript depuis la version 1.0, conservé pour compatibilité.
typeof null retourne 'object' bien que null soit une valeur primitive. Pour tester si une valeur est nulle, utilisez toujours value === null.
Explication :
Le hoisting (élévation) signifie que les déclarations de variables et fonctions sont traitées avant l'exécution.
var x est hoistée et initialisée à undefined. Les function déclarées sont hoistées entièrement. let et const sont hoistées mais en Temporal Dead Zone (TDZ) : y accéder avant leur déclaration lève un ReferenceError.
Exemple clé d'entretien :
console.log(x); var x = 5; → affiche undefined (pas d'erreur). Avec let : ReferenceError. Explique que seule la déclaration est hoistée, pas l'initialisation.
Explication :
push() ajoute des éléments à la fin et retourne la nouvelle longueur. Son opposé est pop() (retire le dernier). Pour le début : unshift() ajoute, shift() retire. append() et insert() n'existent pas nativement en JS vanilla.
Explication :
Array.map() crée un nouveau tableau en appliquant une fonction à chaque élément. L'original n'est pas modifié : 1→2, 2→4, 3→6. Contrairement à forEach() qui ne retourne rien, map() retourne toujours un tableau de même longueur.
Explication :
undefined est assigné automatiquement par JS (variable non initialisée, paramètre absent, propriété inexistante). null est une absence intentionnelle assignée par le développeur. null == undefined → true, null === undefined → false.
Bonne pratique : utilise
null pour signaler 'pas de valeur' dans ton code. Laisse JS assigner undefined automatiquement, ne l'assigne jamais toi-même explicitement.
Explication :
Array.isArray() est la méthode recommandée. typeof [] retourne 'object' (pas 'array'), donc typeof arr === 'array' échoue. arr instanceof Array peut échouer dans un contexte multi-fenêtres (iframes). arr.isArray() n'existe pas.
Explication :
getElementById() retourne l'élément DOM correspondant à l'id, ou null si non trouvé. Les ids doivent être uniques dans une page. Alternative moderne : querySelector('#monId') (plus flexible, accepte tout sélecteur CSS).
Explication :
Une closure est une fonction interne qui conserve l'accès aux variables de sa portée parente, même après que celle-ci a terminé. Exemple :function compteur() {
let n = 0;
return () => ++n;
}
const inc = compteur();
inc(); // 1
inc(); // 2La variable
n est 'fermée' dans la fonction retournée.
Cas d'usage courants : données privées (module pattern), mémoïsation, event handlers avec contexte. Donne toujours un exemple concret d'un compteur ou d'un accumulateur.
Explication :
Array.filter() crée un nouveau tableau avec seulement les éléments pour lesquels la fonction retourne true. Ici, 2 et 3 sont > 1 → [2, 3]. L'original n'est pas modifié. Différence avec map() : filter sélectionne, map transforme.
Explication :
Le spread operator
[...arr] crée une copie superficielle (shallow copy). let copy = arr copie la référence (même tableau en mémoire !). Alternatives : arr.slice(), Array.from(arr). Attention : pour des tableaux d'objets imbriqués, il faut une copie profonde (deep copy).
Explication :
this est déterminé au moment de l'appel. Méthode d'objet : this = l'objet. Fonction seule (mode non-strict) : this = window. Mode strict : undefined. Arrow function : this est lexical (hérite du parent). Avec call()/bind()/apply() : this est explicité.
Piège classique :
const fn = obj.methode; fn(); → this = window (perte du contexte). Solution : fn.bind(obj) ou arrow function. Mentionne ce cas en entretien.
Explication :
JSON.parse() désérialise une chaîne JSON en valeur JavaScript (objet, tableau, nombre...). Son inverse est JSON.stringify(). Attention : JSON requiert des guillemets doubles pour les clés et chaînes. Une syntaxe invalide lève un SyntaxError.
Explication :
addEventListener() est la méthode standard. Elle permet plusieurs listeners sur le même événement, contrairement à onclick = fn qui écrase le précédent. Pour supprimer : removeEventListener() (la fonction doit être nommée, pas anonyme).
Explication :
JavaScript est single-threaded (un seul fil). L'asynchrone permet de lancer des opérations longues (réseau, timers) sans bloquer l'UI. Le moteur utilise l'event loop : tâches async → callback queue → exécutées quand le call stack est vide. Mécanismes : callbacks → Promises → async/await.
Ordre d'exécution : code synchrone → microtasks (Promises) → macrotasks (setTimeout). Exemple :
setTimeout(fn, 0) s'exécute APRÈS les Promises déjà résolues.
Explication :
split('') avec séparateur vide découpe la chaîne caractère par caractère. Autres usages : split(' ') par espaces, split(',') par virgules. Pour réassembler : arr.join('') (inverse de split).
Explication :
reduce(callback, valeurInitiale) parcourt le tableau et accumule un résultat. Exemple : [1, 2, 3].reduce((acc, val) => acc + val, 0) → 6. Très puissant pour sommer, combiner ou transformer des tableaux en objets.
Cas d'usage courant :
arr.reduce((acc, el) => ({ ...acc, [el.id]: el }), {}) pour transformer un tableau en objet indexé.
Explication :
Une Promise a 3 états : pending (en attente), fulfilled (résolue) ou rejected (rejetée). On chaîne avec
.then() pour le succès et .catch() pour les erreurs. C'est la base d'async/await.
Exemple simple :
fetch('/api').then(res => res.json()).then(data => console.log(data)).catch(err => console.error(err));
Explication :
Les template literals utilisent les backticks (`) et permettent l'interpolation avec
${expression}. Ils supportent aussi les chaînes multi-lignes sans \n. Introduits en ES6.
Explication :
La déstructuration permet d'extraire des valeurs en une ligne :
const { nom, age } = personne; au lieu de const nom = personne.nom; const age = personne.age;. On peut aussi renommer : const { nom: prenom } = obj;.
La déstructuration fonctionne aussi dans les paramètres de fonction :
function afficher({ nom, age }) { ... }.
Explication :
preventDefault() annule le comportement natif du navigateur. Exemples : empecher un formulaire de soumettre (submit), empecher un lien de naviguer (click sur <a>), bloquer le menu contextuel. A distinguer de stopPropagation() qui stoppe la propagation vers les parents.
Combine avec
stopPropagation() : e.preventDefault(); e.stopPropagation(); - bloque a la fois le comportement natif et la remontee dans le DOM.
Explication :
En JavaScript,
typeof retourne "number" pour tous les nombres, qu’ils soient entiers ou décimaux. Il n'existe pas de type "integer" ou "float" séparé en JS.
Explication :
L'opérateur
+ favorise la concaténation dès qu'une chaîne est présente. 5 + "5" → "5" + "5" → "55".
Pour additionner des nombres dans ce cas :
5 + Number("5") ou 5 + +"5".
Explication :
Les commentaires multi-lignes utilisent
/* pour ouvrir et */ pour fermer. // est pour une seule ligne.
Explication :
for...in parcourt les propriétés énumérables d'un objet. Pour les tableaux, on préfère for...of ou forEach().
Attention :
for...in parcourt aussi les propriétés héritées. Utilise hasOwnProperty() pour filtrer.
Explication :
Modifier
length à 0 est un moyen rapide et efficace de vider complètement un tableau. Tous les éléments sont supprimés.
Alternatives pour vider un tableau :
arr = [] (crée un nouveau tableau) ou arr.splice(0, arr.length).
Explication :
Les opérations sont évaluées de gauche à droite.
2 + 3 = 5 (nombres), puis 5 + "4" = "54" (concaténation car le second est une chaîne).
Explication :
const empêche la réassignation de la variable. let autorise la réassignation. Attention : pour un objet déclaré avec const, on peut modifier ses propriétés.
Règle simple : utilise
const par défaut, let uniquement si tu as besoin de réassigner.
Explication :
toUpperCase() est une méthode des chaînes qui retourne la chaîne en majuscules. La chaîne originale n'est pas modifiée.
La méthode inverse :
toLowerCase().
Explication :
length est une propriété (pas une méthode) des chaînes et des tableaux. Exemple : "bonjour".length → 7.
Explication :
0 est une valeur falsy. La double négation !! convertit en booléen : !0 = true, puis !true = false.
Les valeurs falsy :
false, 0, "", null, undefined, NaN. Tout le reste est truthy.