Préparation d'entretien 100% Gratuit angularforall.com

Entretien jQuery Junior : AJAX, plugins et perf

Jquery Junior Quiz-Jquery-Junior Jquery-Ajax Deferred-Promise Delegation-Evenements Jquery-Plugins Questions-Entretien-Jquery-Junior Qcm-Jquery-Junior Performance-Jquery Javascript Front-End Ajax-Api Legacy-Frontend
Junior 🔀 Mixte 20 questions ⏱ 15 min
📝

Entretien jQuery Junior : AJAX, plugins et perf

20 questions jQuery niveau junior : requêtes AJAX ($.ajax, $.get, $.post), déféré (Deferred/Promise), délégation d'événements, création de plugins et bonnes pratiques de performance. Pour un entretien jQuery Junior.

20 questions ⏱ ~15 min Niveau Junior

Partager

Banque de révision : les 60 questions corrigées

Voici l'intégralité des 60 questions de « Entretien jQuery Junior : AJAX, plugins et perf », 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.

  • Aucune différence, ce sont des alias
  • $.get() est un raccourci de $.ajax() préconfiguré en GET (bonne réponse)
  • $.ajax() ne supporte que POST
  • $.get() retourne un objet XHR, pas $.ajax()
Explication : $.get(url, data, success, dataType) est un raccourci de $.ajax() avec method: 'GET' préconfiguré. $.ajax() est l'API complète qui expose tous les paramètres : headers, beforeSend, timeout, xhrFields, etc. Tous deux retournent un objet jqXHR (Deferred).
En entretien : utilise $.get() / $.post() pour les cas simples, $.ajax() dès que tu as besoin de headers, timeout ou gestion fine des erreurs.

  • .then(success).catch(error)
  • .done(success).fail(error).always(complete) (bonne réponse)
  • .success(fn).error(fn)
  • .on("done", fn).on("fail", fn)
Explication : $.ajax() retourne un jqXHR qui implémente l'interface Deferred. On chaîne .done(fn) pour le succès, .fail(fn) pour l'erreur, et .always(fn) pour le code exécuté dans les deux cas. Les méthodes .success() et .error() sont dépréciées depuis jQuery 1.8.

  • Désactiver toutes les requêtes AJAX globalement
  • Définir des paramètres par défaut pour toutes les requêtes $.ajax() (bonne réponse)
  • Créer un cache local des réponses AJAX
  • Surveiller les requêtes AJAX en cours
Explication : $.ajaxSetup({ headers: { 'X-CSRF-Token': token }, timeout: 5000 }) définit des paramètres par défaut appliqués à toutes les requêtes $.ajax() suivantes. Utile pour injecter un header d'authentification partout. Attention : impacte aussi les plugins qui utilisent $.ajax() en interne.
Utilise $.ajaxSetup() avec parcimonie. Préfère $.ajaxPrefilter() pour des intercepteurs plus ciblés.

  • $.ajax.cancel()
  • Appeler .abort() sur le jqXHR retourné par $.ajax() (bonne réponse)
  • $.stopAjax()
  • xhr.stop()
Explication : $.ajax() retourne un objet jqXHR. En appelant jqXHR.abort(), la requête est annulée et le callback .fail() est déclenché avec statusText === 'abort'. Exemple : var req = $.ajax(url); req.abort();. Indispensable pour éviter les race conditions (ex : autocomplete).

  • $.ajax().then($.ajax())
  • $.when(req1, req2).done(fn) (bonne réponse)
  • $.parallel([req1, req2]).done(fn)
  • $.all([req1, req2]).then(fn)
Explication : $.when() accepte plusieurs objets Deferred et résout quand tous sont résolus : $.when($.get('/api/a'), $.get('/api/b')).done(function(resA, resB) {}). Chaque argument du callback correspond aux données d'une requête. Si l'une échoue, .fail() est déclenché immédiatement.
Équivalent jQuery de Promise.all(). En entretien, montre que tu connais aussi Promise.all() natif — plus moderne pour du nouveau code.

  • Retourne un objet JSON stringifié
  • Retourne la chaîne name=Alice&age=30 (bonne réponse)
  • Crée un FormData
  • Encode en base64
Explication : $.param() sérialise un objet en chaîne URL-encodée : "name=Alice&age=30". Utile pour construire manuellement le corps d'une requête POST ou les paramètres d'une URL GET. C'est ce que .serialize() utilise en interne pour les formulaires.

  • Aucune, ce sont des alias
  • .serialize() retourne une chaîne URL-encodée, .serializeArray() retourne un tableau d'objets {name, value} (bonne réponse)
  • .serializeArray() retourne une chaîne JSON
  • .serialize() inclut les fichiers
Explication : .serialize() produit "email=a@b.com&password=1234" (chaîne). .serializeArray() produit [{name:'email', value:'a@b.com'}, ...] (tableau). Le tableau est plus pratique pour manipuler les valeurs en JS avant envoi. Ni l'un ni l'autre ne sérialise les <input type="file">.
Pour envoyer des fichiers, utilise FormData natif avec $.ajax({ data: formData, processData: false, contentType: false }).

  • httpHeaders: {}
  • headers: {} (bonne réponse)
  • requestHeaders: {}
  • setHeader: {}
Explication : Le paramètre headers accepte un objet clé/valeur : $.ajax({ url: '/api', headers: { 'Authorization': 'Bearer ' + token } }). Ces headers sont ajoutés à la requête XHR. Combiné avec $.ajaxSetup(), on peut injecter un token d'auth sur toutes les requêtes.

  • La requête s'exécute dans un Web Worker
  • La requête est synchrone et bloque le thread principal jusqu'à la réponse (bonne réponse)
  • La requête est mise en file d'attente
  • Cela n'a aucun effet depuis jQuery 3
Explication : async: false rend la requête synchrone : le navigateur est bloqué jusqu'à la réponse. Déprécié depuis jQuery 1.8. Les navigateurs modernes affichent un avertissement. À remplacer par .done(), .then() ou async/await.
En entretien : expliquer pourquoi async: false est une mauvaise pratique et proposer l'alternative (Promise, async/await) distingue un vrai junior d'un débutant.

  • $.ajax({ nocache: true })
  • $.ajax({ cache: false }) (bonne réponse)
  • Ajouter Cache-Control: no-store dans les données
  • $.ajax({ fresh: true })
Explication : Avec cache: false, jQuery ajoute automatiquement un paramètre _=timestamp à l'URL : /api/data?_=1714500000000. Cela rend chaque URL unique, contournant le cache navigateur. IE était particulièrement agressif dans la mise en cache des GET.

  • $.ajax({ data: $(\"form\").serialize() })
  • $.ajax({ data: new FormData(form), processData: false, contentType: false }) (bonne réponse)
  • $.post({ file: fileInput.value })
  • jQuery ne supporte pas l'envoi de fichiers
Explication : Pour envoyer des fichiers, utilise FormData natif. processData: false empêche jQuery de sérialiser l'objet, et contentType: false laisse le navigateur définir le bon multipart/form-data avec le boundary.
Montre en entretien que tu comprends pourquoi processData: false et contentType: false sont nécessaires — c'est un détail qui distingue un junior qui comprend de celui qui copie-colle.

  • Un objet XMLHttpRequest natif
  • Un objet jqXHR qui implémente l'interface Deferred (bonne réponse)
  • Une Promise ES6 native
  • undefined
Explication : $.ajax() retourne un jqXHR, un objet jQuery qui enveloppe le XHR natif et implémente l'interface Deferred/Promise de jQuery. Il expose .done(), .fail(), .always(), .then(), .abort(). Ce n'est pas une Promise ES6 standard.

  • Transformer la réponse avant traitement
  • Valider les données et pouvoir annuler la requête en retournant false (bonne réponse)
  • Logger automatiquement toutes les requêtes
  • Définir le timeout de la requête
Explication : beforeSend: function(xhr) {} s'exécute juste avant l'envoi. On peut modifier les headers : xhr.setRequestHeader('X-Token', token), afficher un spinner, ou retourner false pour annuler la requête.
Pattern classique : beforeSend pour afficher le spinner et ajouter le token CSRF, complete pour masquer le spinner — quelle que soit la réussite ou l'échec.

  • $(\"#box\").ajax(\"/page.html\")
  • $(\"#box\").load(\"/page.html\") (bonne réponse)
  • $(\"#box\").get(\"/page.html\")
  • $(\"#box\").fetch(\"/page.html\")
Explication : $("#box").load("/page.html") fait une requête GET et injecte automatiquement le HTML retourné dans l'élément. On peut cibler une portion : .load("/page.html #section"). Pratique pour les includes partiels sans rechargement de page.

  • $.getJSON(url, callback) (bonne réponse)
  • $.ajax({ type: \"json\", url: url })
  • $.fetchJSON(url)
  • $.get(url).parseJSON()
Explication : $.getJSON(url, callback) est un raccourci de $.ajax({ url, dataType: 'json', success: callback }). jQuery parse automatiquement la réponse JSON et passe l'objet JS au callback. Retourne un jqXHR, donc chainable avec .done(fn).fail(fn).

  • Un timer différé qui exécute une fonction après un délai
  • Un objet qui représente une opération asynchrone avec des méthodes resolve/reject/promise (bonne réponse)
  • Un proxy pour les appels AJAX
  • Un système de cache pour les requêtes
Explication : $.Deferred() crée un objet représentant une opération asynchrone. On appelle .resolve(data) en cas de succès (déclenche .done()) ou .reject(err) en cas d'échec (déclenche .fail()). Exemple : function loadData() { var d = $.Deferred(); setTimeout(() => d.resolve('ok'), 1000); return d.promise(); }.
Connais la différence avec Promise ES6 : $.Deferred() est mutable (resolve/reject depuis l'extérieur), une Promise ne peut être résolue qu'en interne.

  • Un nouveau Deferred résolu
  • Une version lecture seule du Deferred (sans resolve/reject) (bonne réponse)
  • Une Promise ES6 native
  • Le résultat de la résolution
Explication : .promise() retourne un objet qui expose uniquement .done(), .fail(), .then() — mais pas .resolve() / .reject(). Bonne pratique : toujours retourner deferred.promise() depuis une fonction, jamais le Deferred brut.

  • Aucune différence fonctionnelle
  • .then() retourne un nouveau Deferred (chaînable avec transformation), .done() retourne le Deferred original (bonne réponse)
  • .done() gère aussi les erreurs
  • .then() est synchrone
Explication : .done(fn) ajoute un callback et retourne le même Deferred. .then(fnSuccess, fnFail) retourne un nouveau Deferred avec la valeur retournée par le callback, permettant le chaining avec transformation : $.get('/api').then(data => data.users).done(users => render(users)).
Utilise .then() pour les transformations, .done() pour les effets de bord (affichage, log).

  • "waiting"
  • "pending" (bonne réponse)
  • "running"
  • "idle"
Explication : .state() retourne "pending" (en attente), "resolved" (succès), ou "rejected" (rejeté). Utile pour tester l'état d'un Deferred dans les tests unitaires ou pour un système de retry.

  • La Promise jQuery est plus rapide
  • Le Deferred jQuery n'était pas conforme Promises/A+ avant la v3, et expose des méthodes supplémentaires (bonne réponse)
  • La Promise native ne supporte pas .done()
  • Aucune différence depuis jQuery 3
Explication : Avant jQuery 3, le Deferred n'était pas conforme Promises/A+ : le .then() ne propageait pas correctement les exceptions synchrones. jQuery ajoute .done(), .fail(), .always(), absentes des Promises natives. On ne peut pas utiliser async/await directement sur un jqXHR jQuery 1/2.
Réponse experte : convertir avec Promise.resolve($.ajax(...)) pour utiliser async/await avec jQuery.

  • Exécute fn seulement si les deux Deferred réussissent
  • Exécute fn quand les deux sont terminés, succès ou échec (bonne réponse)
  • Exécute fn seulement si un Deferred échoue
  • Annule les deux Deferred
Explication : .always(fn) s'exécute dans tous les cas : résolution ou rejet. Utile pour masquer un loader ou nettoyer des ressources. Si un Deferred échoue, $.when() est rejeté dès ce premier échec.

  • $(child).on("click", parent, fn)
  • $(parent).on("click", childSelector, fn) (bonne réponse)
  • $(document).delegate(childSelector, "click", fn)
  • $(child).delegate("click", fn)
Explication : La délégation s'attache sur un parent et filtre par sélecteur enfant : $('#liste').on('click', '.item', fn). L'événement bubble du .item jusqu'au #liste, où jQuery vérifie si event.target correspond au sélecteur. Fonctionne pour les éléments ajoutés dynamiquement.
Délègue sur l'ancêtre stable le plus proche, jamais sur document ou body sauf si nécessaire — c'est plus performant.

  • Ils causaient des fuites mémoire systématiques
  • Ils ont été remplacés par .on() qui unifie toutes leurs fonctionnalités (bonne réponse)
  • Ils ne supportaient pas IE8
  • Ils ne fonctionnaient qu'avec les événements souris
Explication : jQuery 1.7 a introduit .on() qui unifie .bind() (handler direct), .live() (délégation sur document), et .delegate() (délégation sur un parent). .on() est plus flexible, plus performant et couvre tous les cas.

  • jQuery surveille le DOM en temps réel avec MutationObserver
  • Le handler est sur le parent — le click bubble depuis l'enfant dynamique jusqu'au parent (bonne réponse)
  • Cela nécessite d'appeler $.refresh() après ajout
  • Cela fonctionne seulement avec $(document).on()
Explication : Le handler est attaché sur un parent stable dans le DOM. Quand un clic se produit sur un enfant dynamique, l'événement remonte (bubble) jusqu'au parent. jQuery vérifie si event.target correspond au sélecteur et exécute le handler. L'élément n'a pas besoin d'exister au moment du binding.

  • Exécute le handler une seule fois puis le supprime automatiquement (bonne réponse)
  • Exécute le handler uniquement si un seul élément est sélectionné
  • Limite la vitesse à une fois par seconde
  • Exécute le handler en mode synchrone
Explication : .one() attache un handler d'événement qui se désabonne automatiquement après sa première exécution. Utile pour les modales, les tutoriels first-run, ou les boutons de confirmation.

  • Aucune différence
  • event.target = élément cliqué, event.currentTarget = élément avec le handler (bonne réponse)
  • event.currentTarget = élément cliqué
  • event.target est disponible uniquement en délégation
Explication : En délégation : $('#liste').on('click', '.btn', fn). event.target est l'élément réellement cliqué, event.currentTarget est toujours #liste (l'élément sur lequel .on() est attaché). Dans le handler en délégation, $(this) correspond au .btn qui a matché le sélecteur.
Question fréquente en entretien. Retiens : $(this) en délégation = l'élément du sélecteur (le .btn), pas le target exact ni le parent.

  • $(el).on("click", { ns: "monPlugin" }, fn)
  • $(el).on("click.monPlugin", fn) (bonne réponse)
  • $(el).namespace("monPlugin").on("click", fn)
  • $.event.ns("monPlugin", el, "click", fn)
Explication : La syntaxe "event.namespace" groupe des handlers : $(el).on('click.tooltip mouseenter.tooltip', fn). Pour tout supprimer : $(el).off('.tooltip') — supprime tous les handlers du namespace sans affecter les autres. Indispensable dans les plugins.

  • jQuery.plugin("nom", function() {})
  • $.fn.nom = function(options) { return this.each(function() {}); } (bonne réponse)
  • $.extend({ nom: function() {} })
  • jQuery.register("nom", function() {})
Explication : Un plugin jQuery s'ajoute à $.fn (alias de jQuery.prototype). La méthode doit retourner this.each() pour le chaînage et le support des collections : $.fn.monPlugin = function(options) { return this.each(function() { /* traitement */ }); };.
3 règles essentielles : 1) retourner this pour le chaînage, 2) this.each() pour les collections, 3) IIFE pour protéger $.

  • Pour améliorer les performances
  • Pour garantir que $ référence jQuery même si $.noConflict() a été appelé, et créer un scope privé (bonne réponse)
  • Pour accélérer le chargement du plugin
  • Pour activer le mode strict automatiquement
Explication : L'IIFE sert deux objectifs : 1) Alias sûr — si $.noConflict() libère $ pour une autre librairie, le plugin continue de fonctionner. 2) Scope privé — les variables internes ne polluent pas le scope global.

  • var opts = options || defaultOptions;
  • var opts = $.extend({}, $.fn.monPlugin.defaults, options); (bonne réponse)
  • var opts = Object.assign(defaultOptions, options);
  • var opts = $.merge(defaultOptions, options);
Explication : $.extend({}, defaults, options) crée un nouvel objet en fusionnant les defaults avec les options passées. Le {} en premier évite de muter l'objet defaults. En exposant $.fn.monPlugin.defaults, on permet aux utilisateurs de changer les defaults globalement.
Pattern avancé : expose $.fn.monPlugin.defaults = { speed: 200 } pour la personnalisation globale sans passer d'options à chaque appel.

  • Dans une variable globale indexée par ID
  • Avec $(el).data("monPlugin", state) (bonne réponse)
  • Dans un attribut data-state HTML
  • Dans $.cache[el.id]
Explication : $(el).data('monPlugin', { initialized: true, options: opts }) stocke des données associées à l'élément dans le cache interne jQuery. On les récupère avec $(el).data('monPlugin'). Les données sont nettoyées automatiquement si l'élément est supprimé via .remove().

  • jQuery le gère automatiquement
  • Vérifier if ($(this).data("monPlugin")) return this; en début de plugin (bonne réponse)
  • Utiliser $.fn.monPlugin.initialized = true
  • Appeler $(this).off() avant d'initialiser
Explication : Pattern de guard : si le plugin a déjà stocké son état via .data(), retourner this immédiatement. Sinon, initialiser et stocker l'état. Évite les double-bindings d'événements et les initialisations redondantes.
Alternative : expose une méthode 'destroy' qui nettoie .data() et .off('.monPlugin'), permettant une réinitialisation propre.

  • Ajouter la méthode directement sur l'élément DOM
  • Appeler $(el).monPlugin("nomMethode", args) et gérer les strings dans le plugin (bonne réponse)
  • Retourner un objet avec les méthodes
  • Utiliser $.fn.monPlugin.nomMethode()
Explication : Pattern jQuery courant : $.fn.monPlugin = function(method, ...args) { if (typeof method === 'string') { /* appel méthode */ } else { /* init */ } }. Usage : $('#el').monPlugin('open'). C'est le pattern utilisé par jQuery UI.

  • Pour réduire la taille du code
  • Pour éviter de parcourir le DOM à chaque utilisation — $(selector) est coûteux (bonne réponse)
  • Pour permettre le garbage collection plus rapide
  • jQuery ne met pas les sélecteurs en cache automatiquement
Explication : Chaque appel $("#id") déclenche une traversée du DOM. Si le même sélecteur est utilisé dans une boucle ou un handler fréquent, stocker le résultat évite ce coût : var = $('#submit');. Convention : préfixer les variables jQuery avec $.
Règle pratique : si tu utilises un sélecteur plus d'une fois, mets-le en cache. Critique dans les loops, scroll handlers, ou animations.

  • Aucune différence
  • .detach() conserve les données et événements jQuery, .remove() les supprime (bonne réponse)
  • .remove() est asynchrone
  • .detach() supprime uniquement les enfants
Explication : .remove() supprime l'élément du DOM et efface toutes les données .data() et handlers .on(). .detach() retire l'élément mais conserve ces métadonnées. Utile pour déplacer un élément fréquemment sans perdre les handlers.

  • Utiliser .each() avec .append() dans la boucle
  • Construire tout le HTML en une chaîne, puis insérer en une seule fois (bonne réponse)
  • .html() est toujours plus rapide que .append()
  • jQuery optimise automatiquement les insertions multiples
Explication : Chaque .append() dans une boucle déclenche un reflow. Solution : construire une chaîne HTML complète et faire une seule insertion : var html = ''; $.each(data, function(i,d) { html += '<li>' + d + '</li>'; }); $('ul').html(html);.
Alternative moderne : document.createDocumentFragment() pour construire le DOM hors de la page puis insérer en une fois.

  • Empêche le comportement par défaut
  • Empêche aussi l'exécution des autres handlers sur le même élément pour cet événement (bonne réponse)
  • Empêche le bubbling ET le capturing
  • Arrête toutes les animations en cours
Explication : stopPropagation() arrête la propagation vers les parents. stopImmediatePropagation() arrête la propagation ET bloque les autres handlers sur le même élément pour le même événement. Si plusieurs handlers .on('click') sont sur #btn, stopImmediatePropagation() dans le premier empêche les suivants.

  • Plusieurs appels .css("prop", val) séparés
  • $el.css({ color: "red", fontSize: "14px", margin: "10px" }) (bonne réponse)
  • $.setCss($el, "color:red; font-size:14px")
  • Ajouter/retirer une classe CSS est toujours préférable
Explication : Passer un objet à .css() applique toutes les propriétés en une opération, minimisant les reflows. Chaque appel individuel peut déclencher un reflow séparé. Mieux encore : utiliser .addClass() avec une classe CSS prédéfinie — meilleur pour la maintenabilité.
Règle d'or : évite le CSS inline via JS. Définis une classe et utilise .addClass(). Réserve .css() pour les valeurs dynamiques (positions calculées, couleurs générées).

  • Déclenche une erreur silencieuse
  • Est une référence à une fonction vide function() {} (bonne réponse)
  • Annule la dernière opération jQuery
  • Est un alias de null
Explication : $.noop est une fonction vide partagée. Utile comme valeur par défaut de callback : function animate(el, cb) { cb = cb || $.noop; cb(); }. Évite de créer une nouvelle fonction anonyme vide à chaque appel — micro-optimisation et bonne pratique.

  • Aucune différence
  • $.each() itère sur des tableaux/objets JS, .each() itère sur une collection jQuery (bonne réponse)
  • $.each() est asynchrone
  • .each() retourne un tableau de résultats
Explication : $.each(array/object, fn) est un itérateur généraliste pour les tableaux et objets JS. $(selector).each(fn) itère sur les éléments DOM de la collection jQuery avec this == l'élément courant.
Dans les plugins, utilise return this.each(function() {}) pour gérer les collections multi-éléments et maintenir le chaînage.

  • true
  • [3, 4] (bonne réponse)
  • [1, 2]
  • 2
Explication : $.grep(array, fn) filtre un tableau en retenant les éléments pour lesquels la fonction retourne true. Seuls 3 et 4 sont > 2. Équivalent de Array.prototype.filter().

  • [1, 2, 3]
  • [2, 4, 6] (bonne réponse)
  • 6
  • { 0:2, 1:4, 2:6 }
Explication : $.map(array, fn) transforme chaque élément et retourne un nouveau tableau aplati. Différence avec .map() natif : $.map() aplatit les tableaux retournés, et retourner null/undefined supprime l'élément du résultat.

  • $.inArray(array, value) — retourne true ou false
  • $.inArray(value, array) — retourne l'index ou -1 (bonne réponse)
  • $.inArray(value, array) — retourne true ou false
  • $.inArray(array, value) — retourne l'index ou null
Explication : $.inArray(value, array) retourne l'index de la première occurrence, ou -1. Attention à l'ordre : valeur d'abord, tableau ensuite. Pour tester la présence : if ($.inArray('alice', users) !== -1) {}.
Piège classique : l'ordre inversé des arguments. Préfère array.includes(value) en JS moderne — plus lisible et sans dépendance jQuery.

  • Fusion superficielle de obj1 et obj2
  • Fusion profonde (deep merge) récursive de obj1 et obj2 dans un nouvel objet (bonne réponse)
  • Copie uniquement les propriétés de obj1
  • Retourne un tableau des propriétés
Explication : Le premier argument true active la fusion profonde : les objets imbriqués sont fusionnés récursivement. Sans true, c'est une fusion superficielle. Exemple : $.extend(true, {}, {a:{x:1}}, {a:{y:2}}){a:{x:1, y:2}}.

  • $(selector).within(context)
  • $(selector, context) ou $(context).find(selector) (bonne réponse)
  • $.find(selector, context)
  • $(selector).context(el)
Explication : $(selector, context) limite la recherche à un sous-arbre DOM. Équivalent de $(context).find(selector). Dans les plugins : $('.btn', this) cherche les .btn uniquement à l'intérieur de l'élément courant.
Toujours scoper les sélecteurs dans les plugins pour éviter les collisions avec d'autres composants.

  • "object"
  • "array" (bonne réponse)
  • "list"
  • "collection"
Explication : $.type() est plus précis que typeof : il retourne "array" pour les tableaux, "null" pour null, "regexp", "date", etc. typeof [] retourne "object" (imprécis).

  • Retourne [1, 2, 3, 4] en mutant le premier tableau (bonne réponse)
  • Retourne un nouveau tableau [1, 2, 3, 4] sans muter les originaux
  • Retourne { 0:1, 1:2, 2:3, 3:4 }
  • Retourne [3, 4, 1, 2]
Explication : $.merge(first, second) mute le premier tableau en y ajoutant les éléments du second, puis retourne ce tableau. Différence importante avec [...a, ...b] qui crée un nouveau tableau sans mutation.

  • S'exécute uniquement en cas de succès
  • S'exécute après success ou error, dans les deux cas (bonne réponse)
  • S'exécute avant l'envoi
  • Est équivalent à .done()
Explication : complete: function(xhr, status) {} est exécuté après success ou error, quelle que soit l'issue. Correspond à .always() dans le chaining. Utile pour masquer un spinner ou réactiver un bouton.
Pattern production : beforeSend → affiche spinner, complete → masque spinner. success → mise à jour UI, error → message d'erreur.

  • $.ajax({ maxTime: 5000 })
  • $.ajax({ timeout: 5000 }) (bonne réponse)
  • $.ajax({ delay: 5000 })
  • $.ajax({ wait: 5000 })
Explication : timeout: 5000 (ms) annule la requête si elle ne se termine pas dans le délai. Le callback .fail() est appelé avec statusText === 'timeout'. On teste : if (jqXHR.statusText === 'timeout') { /* retry */ }.

  • Une liste de callbacks AJAX
  • Un système de listes de callbacks avec des flags de comportement (once, memory, unique, stopOnFalse) (bonne réponse)
  • Un gestionnaire d'erreurs global
  • Un alias de $.when()
Explication : $.Callbacks(flags) crée une liste de fonctions gérable. Flags : 'once' (s'exécute une seule fois), 'memory' (les callbacks ajoutés après le fire reçoivent les derniers args), 'unique' (pas de doublons), 'stopOnFalse'. C'est la base interne de $.Deferred().
Utile pour implémenter un système d'événements ou un hook system dans une librairie.

  • Retourne "hello" (supprime les espaces début/fin) (bonne réponse)
  • Retourne "helo" (déduplique les lettres)
  • Retourne " hello" (supprime uniquement les espaces de fin)
  • Retourne la longueur sans espaces
Explication : $.trim(str) supprime les espaces en début et fin de chaîne. Équivalent de str.trim() natif. $.trim() était utile pour la compatibilité IE8. En code moderne, préfère le .trim() natif.

  • typeof fn === "function" ou $.isFunction(fn) (déprécié) (bonne réponse)
  • Uniquement $.isFunction(fn)
  • fn instanceof Function uniquement
  • $.type(fn) === "function" uniquement
Explication : $.isFunction(fn) est déprécié depuis jQuery 3.3 au profit de typeof fn === 'function'. Les deux sont équivalents pour les fonctions classiques.
Recommandation : utilise typeof fn === 'function' — plus lisible, pas de dépendance jQuery, ne sera jamais déprécié.

  • $.isArray([]) retourne true, typeof [] retourne "object" (bonne réponse)
  • Aucune différence, les deux retournent "array"
  • typeof [] retourne "array"
  • Les deux retournent true
Explication : typeof [] retourne "object" — comportement historique JS. $.isArray([]) retourne true. Équivalent moderne : Array.isArray([]). $.isArray() est déprécié depuis jQuery 3.2.

  • $(el).dispatch("monEvent")
  • $(el).trigger("monEvent", [data]) (bonne réponse)
  • $(el).emit("monEvent", data)
  • $.event.trigger("monEvent", el)
Explication : $(el).trigger('monEvent', [data1, data2]) déclenche l'événement et le propage en bubbling. Le handler reçoit les données en arguments : $(el).on('monEvent', function(e, d1) {}). Pattern PubSub jQuery : $(document) sert de bus d'événements global.
Pattern PubSub : $(document).on('userLoggedIn', fn) pour s'abonner, $(document).trigger('userLoggedIn', [user]) pour publier.

  • $el.dom()
  • $el.get(0) ou $el[0] (bonne réponse)
  • $el.native()
  • $el.element()
Explication : .get(0) et retournent le nœud DOM natif. Utile pour les APIs natives non couvertes par jQuery : var canvas = $('#myCanvas').get(0); var ctx = canvas.getContext('2d');.

  • .queue() est uniquement pour les animations CSS
  • $el.queue(function(next) { /* action */ next(); }) (bonne réponse)
  • $el.queue("fx").push(fn)
  • $.queue($el, fn)
Explication : $(el).queue(fn) ajoute une fonction à la file d'exécution "fx" (la même que .animate()). La fonction reçoit next qu'il faut appeler pour continuer : .fadeIn().queue(function(next) { doSomething(); next(); }).fadeOut();.

  • Crée un plugin statique $.monPlugin()
  • Ajoute monPlugin à $.fn — accessible sur toutes les collections jQuery (bonne réponse)
  • Étend l'objet $ global avec une méthode statique
  • Crée un alias d'une méthode existante
Explication : $.fn.extend(obj) équivaut à $.fn.monPlugin = function() {} mais permet d'ajouter plusieurs méthodes à la fois. Les méthodes s'utilisent sur les collections : $('.el').monPlugin(). Différent de $.extend() qui étend l'objet $ lui-même.
Utilise $.extend() pour les utilitaires statiques ($.maFn()), $.fn.extend() pour les méthodes d'instance ($(el).maFn()).

  • Aucune différence
  • triggerHandler exécute les handlers sans déclencher le comportement natif ni le bubbling (bonne réponse)
  • triggerHandler déclenche l'événement sur tous les enfants
  • triggerHandler retourne un Deferred
Explication : .triggerHandler() exécute les handlers jQuery sans : 1) bubbling, 2) comportement natif (form non soumis), 3) s'applique uniquement au premier élément. Utile pour les tests ou pour déclencher un hook sans effets de bord.

  • $(window).on("resize", $.debounce(fn, 300))
  • En utilisant setTimeout et clearTimeout manuellement dans le handler (bonne réponse)
  • $(window).on("resize").delay(300).then(fn)
  • $(window).one("resize", fn)
Explication : jQuery n'a pas de $.debounce() natif. Pattern : var timer; $(window).on('resize', function() { clearTimeout(timer); timer = setTimeout(function() { /* action */ }, 300); });. La fonction ne s'exécute qu'après 300ms sans nouvel appel.
En production, utilise Lodash _.debounce() ou écris ta propre : function debounce(fn, delay) { var t; return function() { clearTimeout(t); t = setTimeout(() => fn.apply(this, arguments), delay); }; }.

  • Suspend toutes les requêtes AJAX
  • Retarde le déclenchement de $(document).ready() jusqu'à $.holdReady(false) (bonne réponse)
  • Gèle les animations jQuery
  • Met en pause le garbage collector
Explication : $.holdReady(true) retarde le DOM ready. Utile pour charger un plugin asynchrone avant de lancer l'application : $.holdReady(true); $.getScript('/plugin.js', function() { $.holdReady(false); });.
Usage rare mais utile pour les architectures modulaires qui chargent des dépendances dynamiquement avant l'init de l'app.