Aller au contenu
Sommaire

Fiche mémo JavaScript et TypeScript

Fiche mémo · environ 8 min de lecture

Validé

Validé. Ce site n’exécute aucune commande. Sources

Où s'exécute le code

HôteApporteN'a pas
navigateurDOM, fetch, localStorage, bac à sablefichiers, processus
Node.jsnode:fs, process, réseau, droits de l'utilisateurwindow, document
TypeScripttypes vérifiés à la compilation, effacés à l'exécutionvalidation des données reçues

Variables et types

BesoinÉcriture
constante (pas de réaffectation)const x = 1; (l'objet reste modifiable)
variable réaffectablelet n = 0; (portée de bloc)
à évitervar (portée de fonction)
primitifsstring number bigint boolean undefined null symbol
type d'une valeurtypeof x (typeof null vaut "object")
valeur par défauta ?? 10 (seulement null, undefined) ; a || 10 (tout falsy)
chaînage facultatifobj?.champ?.[0]?.()
gabarit` Bonjour ${nom} `

Falsy : false 0 "" null undefined NaN.

Égalité et coercition

ExpressionRésultat
"0" == 0true (conversion)
0 == falsetrue
null == undefinedtrue (et rien d'autre)
"0" === 0false
NaN === NaNfalse ; Number.isNaN(x) ou Object.is(NaN, NaN)
Object.is(0, -0)false (alors que 0 === -0)
"5" + 1 / "5" - 1"51" / 4
0.1 + 0.2 === 0.3false (flottants)

À retenir : === et !== partout ; seule exception acceptable : x == null.

Fonctions, portée, this

javascript
function f(a, b = 2, ...reste) { return a + b; }
const g = (x) => x * x;                 // flèche : this lexical
const h = f.bind(null, 1);              // this et arguments fixés
Appelthis
obj.m()obj
m() seulundefined (strict) ou objet global
flèchecelui de la portée englobante (figé)
new C()le nouvel objet
call(o, a) / apply(o, [a]) / bind(o)o (pas pour une flèche)
écouteur DOMl'élément

Fermeture : une fonction garde l'accès aux variables de sa portée de création.

Objets, classes

javascript
const o = { a: 1, m() { return this.a; } };
const { a, ...reste } = o;               // destructuration
const copie = { ...o, a: 2 };            // copie superficielle
class B { #prive = 0; constructor(n) { this.n = n; } get v() { return this.#prive; } static s() {} }
class D extends B { constructor(n) { super(n); } }
BesoinOutil
clés / valeurs / pairesObject.keys / values / entries
propriété propreObject.hasOwn(o, "k")
prototypeObject.getPrototypeOf(o), Object.create(p)
copie profondestructuredClone(o) (disponibilité par version non vérifiée)
clés externesMap ou Object.create(null)

Tableaux

MéthodeRôleModifie ?
map(f) / filter(f)transforme / filtrenon
reduce((acc, x) => …, init)agrègenon
find / findIndex / some / every / includescherche, testenon
slice / concat / [...a]copienon
push pop shift unshift splice reverse sortmodifieoui

[10, 2, 1].sort() trie en chaînes ; nombres : .sort((a, b) => a - b). Parcourir : for (const x of a) (pas for…in).

Modules ES

javascript
export const A = 1;  export default function () {}
import d, { A as B } from "./m.mjs";   import * as m from "./m.mjs";
const mod = await import("./m.mjs");    // dynamique
SujetRègle
strictautomatique dans un module
liaisonsvivantes, en lecture seule
Node.js.mjs = ES, .cjs = CommonJS, .js selon "type" de package.json
__dirnameabsent en ES : import.meta.dirname
navigateur<script type="module" src="…">

Asynchrone

Ordre : synchrone → toutes les micro-tâches → une tâche → …

Schéma : la pile d'appels confie les appels asynchrones à l'API de l'hôte ; les rappels prêts entrent dans la file de micro-tâches (promesses, await) ou dans la file de tâches (minuteurs, événements) ; pile vide, la boucle vide les micro-tâches puis prend une tâche.1. Pile d'appelsle code en cours, un appel à la foissetTimeout, fetch…2. API de l'hôtenavigateur ou Node.js : minuteurs, réseau, DOMrésultat prêt3a. File de micro-tâchesthen, await, queueMicrotask3b. File de tâchesminuteurs, événements, entrées-sortiespile vide4. Boucle d'événementstoutes les micro-tâches, puis une tâcheChaque travail va au bout avant le suivant
Boucle d'événements : micro-tâches avant tâches.
BesoinOutil
micro-tâchePromise.then, await, queueMicrotask(f)
tâchesetTimeout(f, 0), événements, E/S
toutes tenues, échec rapidePromise.all([…])
toutes régléesPromise.allSettled([…])
première réglée / première tenuePromise.race / Promise.any
nettoyage.finally(f)
javascript
async function charger() {
  try {
    const [a, b] = await Promise.all([lireA(), lireB()]);   // parallèle
    return a + b;
  } catch (e) {
    console.error(e.message);
    throw e;
  }
}
charger().catch((e) => { process.exitCode = 1; });

Attention : await oublié ; await dans forEach ; promesse sans catch ; calcul long qui bloque tout.

Erreurs et JSON

BesoinÉcriture
leverthrow new Error("message") / sous-classe de Error
captertry { … } catch (e) { … } finally { … }
tester le typee instanceof MonErreur ; relancer le reste
texte vers valeurJSON.parse(t) (lève si invalide)
valeur vers texteJSON.stringify(v, null, 2) (pas de undefined, de fonction ni de date)

Après JSON.parse : valider la forme des champs. Jamais d'eval.

DOM et événements

BesoinÉcriture
sélectionnerdocument.querySelector("#id") / querySelectorAll(".c")
texteel.textContent = valeur (sûr)
créer / ajouter / retirercreateElement("li") / parent.append(el) / el.remove()
écouterel.addEventListener("click", (ev) => …)
délégationun écouteur sur le parent, test de ev.target
annuler l'action par défautev.preventDefault()

Node.js

BesoinÉcriture
argumentsprocess.argv : [exécutable, script, …arguments]
environnementprocess.env.NOM
code de sortieprocess.exitCode = 1
module intégréimport { readFile } from "node:fs/promises";
Terminal
node script.mjs argumentecho $?
  • Contexte : Terminal, dossier de test ; Node.js (version non vérifiée).
  • Droits : utilisateur normal.
  • Effet : lance le script ; le script a les droits de l'utilisateur.
  • Vérification : echo $? donne le code de sortie.
  • Retour arrière : sans objet.

npm : sûr par défaut

CommandeEffetRéserve
npm ciinstalle exactement le verrou ; échoue s'il y a désaccord ; supprime node_modulesexige package-lock.json ; scripts des dépendances exécutés
npm install nomajoute une dépendance, modifie package.json et le verrouexécute du code tiers (scripts d'installation)
npm install --ignore-scripts …n'exécute pas les scripts d'installationeffet exact par commande non relu
npm auditrapport de vulnérabilités déjà connues (envoi au registre)propre ne veut pas dire sûr
npm audit fixmet à jour (lance un npm install, scripts compris)--force : changements majeurs, relire
npm audit signaturesvérifie signatures et attestations de provenance
npm lsliste l'arbre installélecture seule

Scripts exécutés à l'installation : preinstall, install, postinstall, prepublish, preprepare, prepare, postprepare.

Attention : installer un paquet = exécuter le code de son auteur avec vos droits. Verrou versionné, peu de dépendances, nom du paquet vérifié, jamais sudo npm, jamais curl … | sh ou npx d'un paquet non relu, aucun secret dans le dépôt.

Sécurité : à ne pas faire

Interdit avec une entrée externeRemplaçant
el.innerHTML = entreeel.textContent = entree ; sinon Trusted Types + assainissement + CSP
eval(t), new Function(t)JSON.parse, table de correspondance
exec("cmd " + entree)execFile / spawn avec liste d'arguments (non relu)
requête SQL concaténéeparamètres liés du pilote
href = entreevalider le schéma de l'URL
fusion aveugle d'objetsvalider les clés ; Map
secret dans le code du navigateursecret côté serveur

Validation : liste blanche de champs et de valeurs, côté serveur aussi. Un type TypeScript ne valide rien à l'exécution.

TypeScript

typescript
type Statut = "ouvert" | "ferme";                       // union de littéraux
interface Ticket { id: number; titre: string; statut: Statut; note?: string; readonly cree: string }
function premier<T>(xs: T[]): T | undefined { return xs[0]; }
function cle<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }
BesoinÉcriture
inférencen'annoter que paramètres et retours exportés
type inconnu sûrunknown (à réduire avant usage) ; éviter any
tableau, dictionnairestring[], Record<string, number>
assertion (aucun effet à l'exécution)x as T ; x! retire null/undefined : à éviter
type ou interfaceinterface pour une forme d'objet (extensible) ; type pour unions
vérifier sans produirenpx tsc --noEmit

Réduction de type (narrowing)

TechniqueExemple
typeoftypeof x === "string"
véritéif (x)
égalitéx === y ; x == null
in"vol" in animal
instanceofx instanceof Date
prédicatfunction ok(a): a is Poisson
union discriminéeswitch (f.genre) { case "cercle": … }
exhaustivitéconst _: never = f; dans default

tsconfig

OptionEffet
strict: trueactive alwaysStrict, strictNullChecks, strictBindCallApply, strictBuiltinIteratorReturn, strictFunctionTypes, strictPropertyInitialization, noImplicitAny, noImplicitThis, useUnknownInCatchVariables
noUncheckedIndexedAccessundefined ajouté aux accès par index (hors strict)
target, module, lib, outDir, includecible, modules, API connues, sortie, fichiers (valeurs : selon la version, non vérifiées)

Pièges courants

PiègeRemède
=====
0.1 + 0.2tolérance ou entiers
typeof nullx === null
sort() par chaînescomparateur numérique
this perduflèche, bind
await oublié / dans forEachawait, for…of, Promise.all
rejet non gérécatch partout
copie superficiellestructuredClone
innerHTML, evaltextContent, JSON.parse
npm install aveugle--ignore-scripts, dossier jetable, verrou
as / !réduction de type, validation

Sources

Consultées le 17 octobre 2026 (versions affichées : Node.js v26.12.0, npm v11.21.0, ECMAScript 2027 brouillon).