Nouveautés du langage
ECMAScript 2025, publié en juin 2025, ajoute les iterator helpers .map(), .filter(), .take() et .drop() directement sur les objets itérables. Ces méthodes effectuent une évaluation paresseuse : aucune nouvelle structure de données n’est créée tant que la consommation ne le requiert. Le code montre la différence de mémoire entre une chaîne d’appels sur un tableau (array.map(...).filter(...).slice(...)) et la même logique appliquée à un itérateur (Iterator.from(array).map(...).filter(...).take(3).toArray()). La version paresseuse évite la création d’intermédiaires et arrête le calcul dès que le nombre d’éléments demandé est atteint, ce qui réduit le coût en temps et en espace pour de grands ensembles.
const result = Iterator.from(array)
.map(x => x * 2)
.filter(x => x > 10)
.take(3)
.toArray();
Extensions des collections
Le même standard introduit un ensemble de méthodes sur Set : intersection, union, difference, symmetricDifference, isSubsetOf, isSupersetOf et isDisjointFrom. Chaque opération renvoie un nouveau Set décrivant la relation demandée entre deux ensembles. Par exemple, youKnow.intersection(jobNeeds) produit les compétences communes, tandis que jobNeeds.difference(youKnow) identifie les compétences manquantes. Ces ajouts permettent de remplacer les boucles manuelles ou les filtres basés sur Array par des appels déclaratifs, ce qui simplifie la logique métier et évite les conversions coûteuses entre types.
const youKnow = new Set(["JS","Python","CSS","SQL"]);
const jobNeeds = new Set(["JS","TypeScript","Python"]);
youKnow.intersection(jobNeeds); // → Set {"JS","Python"}
jobNeeds.difference(youKnow); // → Set {"TypeScript"}
Améliorations des expressions régulières
ECMAScript 2025 ajoute RegExp.escape(), une fonction qui transforme une chaîne en une séquence d’échappement compatible avec les métacaractères regex. Cette méthode élimine la nécessité d’écrire des remplacements manuels pour chaque caractère spécial. Le même texte introduit les modificateurs en ligne, syntaxe (?i:…) pour activer le mode insensible à la casse sur une sous‑expression et (?-i:…) pour le désactiver. Cette granularité évite de devoir créer plusieurs expressions distinctes lorsqu’une partie du motif doit être sensible à la casse et l’autre non.
const query = "$5.00 (off!)";
const safe = new RegExp(RegExp.escape(query), "g");
// Inline modifiers example
const emailRe = /(?i:[a-z.]+)@(?-i:[A-Z]+)\.(?i:com|org)/;
Mises à jour de l’asynchronisme et des imports
Le prototype Promise reçoit Promise.try(), qui exécute une fonction et capture à la fois les exceptions synchrones et les rejets asynchrones dans un même .catch(). Le modèle supprime la structure try / catch séparée pour les appels synchrones, réduisant le nombre de lignes de code et le risque d’oubli de gestion d’erreur. Par ailleurs, les import attributes permettent d’importer directement des ressources JSON avec la syntaxe import data from "./file.json" with {type:"json"}. Cette forme évite le fetch‑parse manuel, mais le chargement échoue de façon globale si le module JSON ne peut pas être résolu, ce qui peut interrompre le graphe de modules complet.
Promise.try(() => loadUser(id))
.then(user => render(user))
.catch(err => showError(err));
import data from "./file.json" with {type: "json"};