ECMAScript 2021, la dernière version de la spécification officielle sous-jacente à JavaScript, a été officiellement approuvée ce 22 juin. Comme annoncé précédemment, les nouvelles fonctionnalités citées ci-dessous ont été retenues par l'ECMA International. Cette spécification introduit des améliorations aux chaînes, à Promise et aux références d'objets. ECMAScript 2021 suit ECMAScript 2020, qui a été officiellement approuvé en juin 2020.
Bref rappel sur le standard ECMAScript de l'ECMA International
ECMAScript est un langage de script qui forme la base de plusieurs langages de script. Les langages tels que JavaScript, ActionScript et JavaScript sont tous basés sur la spécification ECMAScript. De même, JScript et TypeScript de Microsoft l'utilisent comme noyau. ECMAScript est standardisé par l'organisation ECMA International grâce aux spécifications ECMA-262 et ECMA-402. Le développement de la spécification du langage ECMAScript a commencé en novembre 1996. La première édition de cette norme Ecma a été adoptée par l'assemblée générale de l'ECMA en juin 1997.
Depuis la publication de la première édition de la spécification en 1997, ECMAScript est devenu l'un des langages de programmation à usage général les plus utilisés au monde. Il est surtout connu comme le langage intégré aux navigateurs Web, mais il a aussi été largement adopté pour les serveurs et les applications intégrées. Un nouveau standard ECMAScript, l'ECMAScript 2021 ou ES21, vient d'être approuvé et sera livré un peu plus tard dans l'année.
String.prototype.replaceAll()
Pour remplacer toutes les occurrences de chaînes, vous devez utiliser une combinaison de String.prototype.replace et de regexp globale. String.prototype.replaceAll() est une nouvelle méthode introduite par l'ECMA International dans la spécification qui simplifie cette opération. Selon les critiques, la popularité de la question "How to replace all occurrences of a string in JavaScript ?" sur StackOverflow prouve la nécessité de cette fonctionnalité dans le langage.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | const string = "it-is-just-a-test"; // instead of doing this string.replace(/-/g, "_") // "it_is_just_a_test" // in ES2021 we can do string.replaceAll("-", "_") // "it_is_just_a_test" |
Les Promise ne sont pas un concept nouveau dans la communauté JavaScript. Elles existent dans l'écosystème depuis longtemps. Les Promise JavaScript existaient avant même qu'elles ne fassent officiellement partie de la spécification ECMAScript dans ES6. Ce sont des objets qui représentent l'achèvement ou l'échec éventuel d'une opération asynchrone, et la valeur qui en résulte. Il existe trois états possibles pour les Promise : en attente (état initial - toujours en attente), remplie (promesse réussie) et rejetée (Promise non tenue).
Si la Promise est soit remplie, soit rejetée, mais pas en attente, on dit qu'elle est réglée. Les combinateurs de Promise quant à eux sont utilisés pour faciliter le traitement des Promise. Le standard ECMAScript dispose actuellement de trois combinateurs de Promise, notamment Promise.all(), Promise.race(), Promise.allSettled(). ES21 en apporte une nouvelle. Promise.any() rejoint la liste des combinateurs de Promise dans le cahier des charges de cette année. Promise.any() est le dernier combinateur de promesses qui est maintenant à l'étape 3 du processus TC39.
Il prend un objet itérable et dès que l'une des Promise est remplie, il renvoie cette Promise. La différence entre cette méthode et Promise.all() est que Promise.all() renvoie un tableau de valeurs de réalisation alors que Promise.any() ne renvoie que la première valeur de réalisation.
Code : | Sélectionner tout |
1 2 3 4 5 6 | const API = "https://api.github.com/users" Promise.any([ fetch(`${API}/pawelgrzybek`), fetch(`${API}/gabriel403`) ]) .then(response => response.json()) .then(({name}) => console.log(`Cool dude is: ${name}`)) .catch(error => console.error(error)); |
WeakRefs et Finalizers
La proposition WeakRefs des contributeurs Dean Tribble et Sathya Gunasekaran a apporté deux nouveaux constructeurs, WeakRef et FinalizationRegistry. Ces nouvelles fonctionnalités sont des concepts linguistiques de niveau inférieur beaucoup plus compliqués.
- WeakRefs
WeakRef est l'abréviation de Weak References (références faibles). L'utilisation principale des références faibles est d'implémenter des caches ou des mappages vers de grands objets. Dans de tels scénarios, nous ne voulons pas garder beaucoup de mémoire pendant longtemps, en conservant ce cache ou ces mappages rarement utilisés. Vous pouvez permettre à la mémoire d'être collectée tôt ou tard et si vous en avez besoin à nouveau, vous pouvez générer un nouveau cache. Autrement dit, lorsque vous assignez un objet à une variable, il pointe vers le morceau de mémoire où la valeur de cet objet est stockée (référence forte).
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | const obj = { spec: "ES2021" }; const objWeakRef = new WeakRef(obj); // do something cool objWeakRef.deref(); // returns obj in case it is still in memory // returns undefined in case it has been garbage collected |
- FinalizationRegistry
FinalizationRegistry est une fonction complémentaire de WeakRef. Il permet aux programmeurs d'enregistrer des rappels à invoquer après qu'un objet a été ramassé. Une instance de FinalizationRegistry déclenche une fonction de rappel après qu'un objet cible enregistré a été collecté. Mais attention, il faut éviter de les utiliser selon la recommandation de l'auteur de la proposition. Ces deux fonctionnalités reposent sur l'implémentation d'un collecteur d'ordures qui varie en fonction du moteur et de sa version.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | const obj = { spec: "ES2021" }; const registry = new FinalizationRegistry(value => { console.log(`The ${value} object has been garbage collected.`) }); registry.register(obj, "ECMAScript 2021"); // perform some action that triggers garbage collector on obj // The ECMAScript 2021 object has been garbage collected. |
Comme son nom l'indique, la proposition d'affectation logique est la combinaison des opérateurs logiques (&&, || et ? ?) et de l'opérateur d'affectation (=). Un complément pratique au langage ! Jetez un coup d'œil.
Code : | Sélectionner tout |
1 2 3 4 | var x = 1; var y = 2; x &&= y; console.log(x); // 2 |
Code : | Sélectionner tout |
x && (x = y)
Code : | Sélectionner tout |
1 2 3 | if(x) { x = y } |
Code : | Sélectionner tout |
1 2 3 | x &&= y; x ||= y; x ??= y; |
Les grands nombres sont difficiles à lire. Grâce à Rick Waldron de l'équipe de contributeurs, vous pouvez maintenant séparer un groupe de chiffres en utilisant des traits de soulignement (_, U+005F). Cette fonctionnalité est bien connue d'autres langages de programmation comme Java, Python, Perl, Ruby, Rust, Julia, Ada, C#.
La version ECMAScript 2021 devrait être publiée au mois de juin 2021. Toutes les fonctionnalités énumérées ci-dessus sont déjà prises en charge dans la version Google Chrome Canary.
Source : ECMAScript 2021
Et vous ?
Que pensez-vous des nouvelles fonctionnalités introduites par ES21 ?
Quelles fonctionnalités vous attirent le plus dans cette nouvelle version d'ECMAScript ?
Quelles fonctionnalités aimeriez-vous voir apparaître dans la prochaine version du standard ECMAScript ?
Voir aussi
La version candidate d'ECMAScript 2020 est disponible avec l'ensemble des fonctionnalités finales, dont l'opérateur de coalescence nulle (??) et de chaînage optionnel (?.)
ECMAScript 2017 : Ecma International annonce les nouvelles mises à jour de ses spécifications pour les langages de script
ECMAScript 2016 : des mises à jour plus petites et plus fréquentes pour l'ensemble de normes des langages de script
Tutoriel présentant les nouveautés ECMAScript 6