Questions d'entretien techniques sur JavaScript

Types de données fondamentaux en JavaScript

Les types de données primitifs incluent chaîne de caractères, nombre, booléen, null, undefined, objet, symbole et BigInt. Les types primitifs sont stockés dans la pile mémoire, tandis que les types de référence comme les objets, tableaux et fonctions sont stockés dans le tas.

Utilisation d'Ajax

Ajax permet de mettre à jour des parties d'une page sans rechargement complet. Un exemple simplifié :


var requete = new XMLHttpRequest();
requete.open('GET', 'https://exemple.com/api/donnees', true);
requete.onreadystatechange = function() {
    if (requete.readyState === 4 && requete.status === 200) {
        console.log(requete.responseText);
    }
};
requete.send();

Différences entre Ajax, axios et fetch

Ajax est une technique basée sur XMLHttpRequest. Fetch est une API native moderne basée sur les promesses. Axios est une bibliothèque tierce avec intercepteurs et gestion automatique des données.

Détection de NaN

Utiliser typeof valeur === 'number' && isNaN(valeur) pour une vérification précise.

Différence entre null et undefined

null représente une valeur vide intentionnelle, tandis que undefined indique une absence de valeur. Number(null) donne 0, Number(undefined) donne NaN.

Fonctions de fermeture (closures)

Une closure est une fonction qui capture les variables de son environnement lexical. Exemple :


var creationFermeture = function() {
    var variablePrivee = 'donnée privée';
    return function() {
        console.log(variablePrivee);
    };
};
var fermeture = creationFermeture();
fermeture();

Modularisation en JavaScript

CommonJS utilise require/exports pour Node.js, tandis que ES6 utilise import/export pour les navigateurs.

Fuites de mémoire courantes

Les fuites incluent les intervalles non nettoyés, les écouteurs d'événements non supprimés, et les closures maintenant des références.

Propagation d'événements

Les événements se propagent du bas vers le haut (bubbling). Arrêter avec event.stopPropagation().

Délégation d'événements

Ajouter un écouteur à un élément parent, utiliser event.target pour identifier la source.

Stockage côté client

Cookie : petite capacité, envoyé avec les requêtes. localStorage : persistance. sessionStorage : durée de vie limitée à la session.

Nouveautés ES6

Incluent let/const, fonctions fléchées, chaînes de modèles, déstructuration, promesses, modules, et plus.

Boucles for...in et for...of

for...in itère sur les clés d'un objet, for...of itère sur les valeurs d'un itérable.

Déclarations var, let, const

var a une portée fonctionnelle, let/const ont une portée de bloc. const ne peut pas être réassigné.

Méthodes de tableau

Certaines modifient le tableau original (push, pop, splice), d'autres retournent un nouveau tableau (map, filter).

Manipulation de JSON

Convertir en objet avec JSON.parse(), en JSON avec JSON.stringify(). Ajouter ou supprimer des clés directement sur l'objet.

Contrôle du contexte this

bind retourne une nouvelle fonction, apply et call s'exécutent immédiatement avec des arguments différents.


var objet = { valeur: 10 };
function afficher() { console.log(this.valeur); }
var liee = afficher.bind(objet);
liee();

Implémentation de bind


Function.prototype.monBind = function(contexte) {
    var fonctionOriginale = this;
    var argumentsInitiaux = Array.from(arguments).slice(1);
    return function() {
        return fonctionOriginale.apply(contexte, argumentsInitiaux.concat(Array.from(arguments)));
    };
};

Relations entre window et document

document est la représentation du HTML chargé, accessible via window.document.

Programmation orientée objet

Basée sur l'encapsulation, l'héritage et le polymorphisme. Les classes ES6 fournissent une syntaxe claire.

Fonctions et constructeurs

Les constructeurs sont appelés avec new pour créer des instances. this pointe vers l'instance.

Prototypes et chaîne de prototypes

Chaque objet a un prototype. Les propriétés sont cherchées le long de la chaîne jusqu'à Object.prototype.

Opérateur new

Crée un objet vide, lie le prototype, exécute le constructeur et retourne l'objet.

Héritage avec ES6


class Animal {
    constructor(nom) { this.nom = nom; }
    parler() { console.log(this.nom + ' fait un bruit'); }
}
class Chien extends Animal {
    constructor(nom) { super(nom); }
}
var rex = new Chien('Rex');
rex.parler();

Comprendre les promesses

Les promesses gèrent l'asynchrone avec trois états : en attente, résolu, rejeté. Exemple :


var maPromesse = new Promise(function(resolve, reject) {
    setTimeout(function() { resolve('Succès'); }, 1000);
});
maPromesse.then(function(resultat) { console.log(resultat); });

Méthodes des promesses

Promise.all() attend toutes les promesses, Promise.race() attend la première.

async/await

Syntaxe pour écrire du code asynchrone de manière synchrone.


async function exemple() {
    try {
        var donnee = await fetch('https://api.exemple.com');
        console.log(await donnee.json());
    } catch (erreur) {
        console.error(erreur);
    }
}

Processus de chargement de page

DNS, poignée de main TCP, requête HTTP, analyse du DOM et rendu.

Flux d'événements

Capture phase puis bubbling phase. addEventListener avec troisième paramètre pour contrôler la phase.

Event Loop

Mécanisme qui gère l'asynchrone en JavaScript via des files d'attente de macro-tâches et micro-tâches.

Propriétés de dimensionnement

clientHeight inclut padding, offsetHeight inclut border, scrollHeight est la hauteur totale du contenu.

Position de la souris

clientX/Y relatif à la fenêtre, offsetX/Y relatif à l'élément cible.

Glisser-déposer

Utiliser l'API HTML5 Drag and Drop avec événements comme dragstart, dragover, drop.

Récupération de mémoire

JavaScript utilise le comptage de références et le marquage-suppression pour libérer la mémoire non utilisée.

DOM vs BOM

DOM représente le document HTML, BOM représente les objets du navigateur comme window.

Surveillance des propriétés d'objet

Utiliser Object.defineProperty ou Proxy pour intercepter les modifications.

Chargement séquentiel d'images


var urlsImages = ['img1.jpg', 'img2.jpg'];
function chargerImage(src) {
    return new Promise(function(resolve, reject) {
        var img = new Image();
        img.onload = function() { resolve(img); };
        img.onerror = reject;
        img.src = src;
    });
}
async function chargerImages() {
    for (var url of urlsImages) {
        await chargerImage(url);
    }
}

Copie superficielle vs profonde

La copie superficielle ne duplique pas les objets imbriqués, la copie profonde crée une copie indépendante.

Clonage profond


function clonageProfond(objet, vus) {
    if (objet === null || typeof objet !== 'object') return objet;
    if (!vus) vus = new WeakMap();
    if (vus.has(objet)) return vus.get(objet);
    var clone = Array.isArray(objet) ? [] : {};
    vus.set(objet, clone);
    for (var cle in objet) {
        if (objet.hasOwnProperty(cle)) {
            clone[cle] = clonageProfond(objet[cle], vus);
        }
    }
    return clone;
}

Caractéristiques de JavaScript

Typage dynamique, héritage prototypla, exécution côté client et serveur.

Politique de même origine

Empêche les requêtes entre domaines différents pour des raisons de sécurité.

Optimisation du chargement

Compression des ressources, chargement paresseux, utilisation de CDN.

JSONP

Technique de contournement des restricsions de même origine via des balises script.

Dédoublonnage de tableaux

Utiliser Set ou filter avec indexOf.


var unique = [...new Set(tableau)];

Fonctions fléchées vs classiques

Les fonctions fléchées n'ont pas de propre this, arguments ou prototype.

Codes de statut HTTP

200 OK, 404 Not Found, 500 Internal Server Error, etc.

Préchargement et chargement paresseux

Le préchargement anticipe les besoins, le chargement paresseux retarde le chargement des ressources non essentielles.

Throttling et debouncing

Throttling limite la fréquence d'exécution, debounding retarde l'exécution après la dernière invocation.


function debounce(fn, delai) {
    var minuterie;
    return function() {
        clearTimeout(minuterie);
        minuterie = setTimeout(fn, delai);
    };
}

Minuteries en JavaScript

setTimeout pour un délai unique, setInterval pour des répétitions. clear... pour annuler.

typeof et instanceof

typeof pour les types primitifs, instanceof pour vérifier le prototype.

Expressions régulières

Motifs pour la recherche et manipulation de texte. Exemple : /^[a-z]+@[a-z]+\.[a-z]+$/ pour les emails.

Arguments et objets pseudo-tableaux

arguments est accesisble dans les fonctions classiques, convertir avec Array.from(arguments).

Précision des nombres flottants

0.1 + 0.2 !== 0.3 dû à la représentation binaire. Utiliser toFixed() pour arrondir.

Vérification de tableau

Array.isArray() ou instanceof Array.

substring vs substr

substring(start, end), substr(start, longueur).

Mode strict

Active avec 'use strict'; pour un code plus sécurisé et moins tolérant aux erreurs.

Set et Map

Set stocke des valeurs uniques, Map stocke des paires clé-valeur avec des clés de tout type.

Map vs WeakMap

WeakMap accepte uniquement des objets comme clés et utilise des références faibles pour la récupération de mémoire.

Portée et chaîne de portée

Les variables sont cherchées dans les portées imbriquées jusqu'à la portée globale.

Redirection de page

window.location.href en JavaScript, wx.navigateTo en mini-programmes.

Étiquettes: JavaScript ES6 Promise async/await DOM

Publié le 5 juillet à 21h59