Vanilla-Js
Javascript-Natif
Quiz-Vanilla-Js-Junior
Fetch-Api
Promises
Async-Await
Localstorage
Destructuring
Spread-Operator
Closures
Questions-Entretien-Vanilla-Js-Junior
Qcm-Vanilla-Js-Junior
Es6
Javascript
📝
Entretien Vanilla JS Junior — Fetch, ES6 et LocalStorage
20 questions Vanilla JS niveau junior : Fetch API, promesses, async/await, localStorage, destructuring, spread operator, closures et délégation d'événements. Pour réussir un entretien JS natif Junior.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « Entretien Vanilla JS Junior — Fetch, ES6 et LocalStorage », 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 :
fetch(url) retourne une promesse avec la reponse HTTP. .then(r => r.json()) decode le corps JSON asynchronement. La reponse brute n'est pas directement le JSON, il faut appeler r.json() ou r.text().
fetch -> response -> .json() -> donnees (deux then enchaines)
Explication :
map() cree un nouveau tableau sans modifier l'original. La longueur est preservee. Ex: [1,2,3].map(x => x*2) retourne [2,4,6]. C'est un fondamental de la programmation fonctionnelle en JS.
map = transformer chaque element -> nouveau tableau de meme longueur
Explication :
setItem("key", "value") est la methode officielle du Web Storage API. localStorage ne peut stocker que des chaines. Pour des objets, serialiser avec JSON.stringify() avant setItem.
setItem/getItem/removeItem : la triade localStorage
Explication :
Une closure est formee quand une fonction se souvient des variables de sa portee de creation, meme apres que cette portee ait disparu. Utile pour les compteurs, modules ou l'encapsulation.
Closure = fonction + son environnement de creation (memoire de contexte)
Explication :
La delegation tire profit du bubbling : on attache l'ecouteur au parent, et on filtre avec event.target. Fonctionne avec les elements ajoutes dynamiquement, reduit le nombre d'ecouteurs.
Delegation = un ecouteur sur le parent pour gerer tous les enfants
Explication :
Les template literals utilisent des backticks (`) et permettent l'interpolation avec ${expression}. Ils supportent aussi les chaines multi-lignes et les expressions complexes.
Backticks ` + ${variable} = template literal
Explication :
filter() retourne un nouveau tableau (potentiellement plus court) avec les elements pour lesquels la callback retourne true. Ex: [1,2,3,4].filter(x => x > 2) retourne [3,4].
filter = conserver seulement les elements qui passent le filtre
Explication :
La destructuration d'objet utilise {}. La destructuration de tableau utilise []. On peut renommer : let {a: monA} = obj. Valeurs par defaut : let {a = 5} = obj.
{} pour les objets, [] pour les tableaux : la destructuration ES6
Explication :
reduce(fn, init) appelle fn(accumulateur, valeurCourante) pour chaque element. Ex: [1,2,3].reduce((acc, val) => acc + val, 0) = 6. Peut produire n'importe quel type : nombre, objet, tableau.
reduce = compresser tout un tableau en une seule valeur
Explication :
CustomEvent permet de passer des donnees via l'option detail. Pour declencher : element.dispatchEvent(new CustomEvent("monEvent", {detail: {id: 1}})). Pour ecouter : addEventListener("monEvent", e => e.detail).
CustomEvent + detail = evenement personnalise avec payload
Explication :
Par defaut, les evenements remontent de l'element cible vers ses ancetres (bubbling). La phase de capture va dans le sens inverse. stopPropagation() arrete cette remontee.
Bubbling = remonte des enfants aux parents (comme une bulle dans l'eau)
Explication :
parentNode et parentElement retournent tous les deux l'element parent. parentNode peut retourner n'importe quel noeud (document, fragment), parentElement retourne uniquement un Element HTML ou null.
parentNode = noeud parent | parentElement = element HTML parent
Explication :
JSON.stringify() serialise un objet en chaine JSON. Proprietes undefined, fonctions et Symbol sont ignorees. Accepte un replacer et un espace pour formater : JSON.stringify(obj, null, 2).
stringify = objet vers chaine | parse = chaine vers objet
Explication :
[...array] cree une copie superficielle (shallow copy) du tableau. Fonctionne aussi pour fusionner : [...arr1, ...arr2]. Pour les objets : {...obj}. Les objets imbriques ne sont pas clones.
... = spread operator : copie superficielle, fusion de tableaux/objets
Explication :
Une Promise a 3 etats : pending (en attente), fulfilled (resolue) ou rejected (rejetee). .then() gere le succes, .catch() gere l'echec, .finally() s'execute toujours. Resout le callback hell.
Promise = contrat d'une valeur future (resolve/reject)
Explication :
.catch(fn) est equivalent a .then(null, fn). Il capture toutes les erreurs des promesses precedentes dans la chaine. Dans async/await, on utilise try/catch a la place.
.then() = succes | .catch() = erreur | .finally() = toujours
Explication :
async avant function permet l'utilisation de await a l'interieur. await suspend l'execution jusqu'a la resolution de la promesse. Une fonction async retourne toujours une promesse.
async function + await = sucre syntaxique sur les promesses
Explication :
?? est different de || : il ne considere que null/undefined comme valeurs vides. Avec ||, 0, "", false declencheraient le fallback. Avec ??, seuls null et undefined le font.
?? = seulement null/undefined | || = toute valeur falsy (0, "", false...)
Explication :
Le hoisting remonte les declarations (pas les initialisations). var est hoistee avec undefined. Les fonctions declarees (function fn(){}) sont entierement hoistees. let/const sont dans la temporal dead zone.
Hoisting = declaration remontee | initialisation reste en place
Explication :
some() court-circuite des qu'un element passe le test (retourne true immediatement). every() retourne true seulement si TOUS passent. find() retourne l'element lui-meme, findIndex() l'index.
some() = au moins un ? | every() = tous ? | find() = valeur | findIndex() = index
Explication :
fetch() ne rejette la promesse que pour des erreurs reseau. Une reponse 404 ou 500 est consideree comme une reponse valide : promesse resolue avec response.ok = false. Il faut verifier manuellement.
fetch echoue seulement sur erreur reseau : verifier response.ok pour les 4xx/5xx
Explication :
?. peut etre utilise a chaque niveau. obj?.prop retourne undefined si obj est null/undefined au lieu de lancer une TypeError. Chainable : user?.address?.city?.zipCode.
?. = court-circuite si null/undefined au lieu de lancer une erreur
Explication :
children retourne une HTMLCollection des elements enfants (ignore les noeuds texte). childNodes retourne une NodeList incluant les noeuds texte et commentaires. Preferer children pour le HTML.
children = elements seulement | childNodes = tous noeuds (texte inclus)
Explication :
getItem("key") retourne la valeur stockee ou null si la cle n'existe pas. La valeur est toujours une chaine : il faut JSON.parse() pour recuperer un objet.
getItem -> null si absent | toujours une chaine -> JSON.parse si objet
Explication :
[...arr], Array.from(arr) et arr.slice() creent toutes une copie superficielle. Les objets imbriques sont partages par reference. Pour une copie profonde : structuredClone() ou JSON.parse(JSON.stringify()).
Shallow copy : [...arr], Array.from(), slice() | Deep copy : structuredClone()
Explication :
every() retourne true seulement si la callback retourne true pour CHAQUE element. Court-circuite des qu'un element echoue. Un tableau vide retourne toujours true (vacuous truth).
every() = est-ce que TOUS ? | court-circuite au premier false
Explication :
Object.assign() modifie et retourne l'objet cible. Pour une copie sans mutation : Object.assign({}, source). C'est une copie superficielle. Les proprietes sont ecrasees si deja presentes dans la cible.
Object.assign({}, obj) = copie d'objet | le spread {...obj} est equivalent
Explication :
Les accolades {} seraient interpretees comme un bloc de code. Pour retourner un objet, il faut l'entourer de parentheses : () => ({key: value}). Sans les parentheses, JS voit un bloc vide avec un label.
Arrow function + objet = parentheses obligatoires : () => ({prop: val})
Explication :
IntersectionObserver detecte quand un element devient visible a l'ecran. Ideal pour le lazy loading d'images, les animations au scroll ou le chargement infini, sans evenements scroll couteux.
IntersectionObserver = lazy loading, animations scroll, infinite scroll
Explication :
find() retourne la valeur du premier element satisfaisant la condition, ou undefined si aucun. findIndex() retourne l'index. filter() retourne tous les elements. some() retourne un booleen.
find() = element | findIndex() = index | filter() = tableau | some() = booleen