JavaScript est le langage le plus utilisé au monde. C'est aussi le plus mal compris. La plupart des développeurs apprennent un framework — React, Vue, Angular — sans comprendre le langage en dessous. Ça fonctionne jusqu'au jour où ça ne fonctionne plus.
Un this qui change de contexte selon l'appel. Un Promise qui avale une erreur en silence. Une closure qui capture une variable mutée. Un forEach qui ignore les await. Ces bugs ne sont pas des bugs de framework. Ce sont des bugs de langage. Et ils coûtent des heures quand on ne comprend pas pourquoi.
Ma force : je ne travaille pas au-dessus de JavaScript. Je travaille avec. Chaque composable Vue, chaque service NestJS, chaque utilitaire que j'écris repose sur une compréhension profonde du langage — prototypes, event loop, closures, coercion, modules ES. C'est cette maîtrise qui rend mon code fiable.
Le JavaScript d'aujourd'hui n'a rien à voir avec celui d'il y a 5 ans. Le langage évolue chaque année via le processus TC39, et les ajouts récents sont significatifs.
Modules ES natifs. Plus de CommonJS en 2026. L'import/export est natif dans tous les navigateurs et dans Node.js. Le tree-shaking fonctionne sans configuration. Le code est déclaratif et analysable statiquement.
Async/await mature. Promise.allSettled(), Promise.any(), top-level await, AbortController pour l'annulation. La gestion asynchrone est propre, lisible et contrôlable. Les callback pyramids sont un souvenir.
API navigateur puissantes. IntersectionObserver, ResizeObserver, Intl, structuredClone, navigator.sendBeacon, Web Animations API. Beaucoup de librairies npm peuvent être remplacées par des API natives, plus légères et plus rapides.
Temporal & Iterator Helpers. Les nouvelles API de dates et de manipulation d'itérateurs arrivent nativement. Fini la dépendance à moment.js ou lodash pour des opérations que le langage gère désormais seul.
J'écris la majorité de mon code en TypeScript. Mais TypeScript compile vers JavaScript. Les types disparaissent au runtime. Ce qui reste, c'est du JavaScript.
Comprendre le prototype chain, c'est comprendre pourquoi instanceof échoue entre iframes. Comprendre la boucle d'événements, c'est comprendre pourquoi un await dans un forEach ne fait pas ce qu'on attend. Comprendre la coercion, c'est comprendre pourquoi [] == false est true.
TypeScript attrape les erreurs de type. Mais les erreurs de logique, de timing, de concurrence, de mémoire — celles-là demandent une compréhension profonde de JavaScript. Les deux sont nécessaires.
ES2025+ systématique. Pas de polyfills quand le support navigateur est suffisant. J'utilise les API modernes du langage et je cible des navigateurs récents. Le code est plus court, plus lisible et plus performant.
Zéro dépendance inutile. Avant d'installer un package npm, je vérifie si une API native fait le travail. structuredClone au lieu de lodash.cloneDeep. URLSearchParams au lieu de qs. Intl.DateTimeFormat au lieu de moment. Moins de dépendances, moins de surface d'attaque, moins de dette.
Performance par défaut. Lazy loading natif, requestAnimationFrame pour les animations, IntersectionObserver pour le chargement différé, virtualisation des listes longues. La performance n'est pas un patch ajouté en fin de projet, c'est une contrainte de design dès le premier commit.
Node.js en production. Pour les backends, j'utilise Node.js avec NestJS. Je connais les patterns de la boucle d'événements — quand utiliser setImmediate vs process.nextTick, comment éviter de bloquer l'event loop, comment gérer les streams pour les fichiers volumineux sans exploser la mémoire.