Nouvelles fonctionnalités JavaScript attendues que vous devez connaître

Depuis la sortie de la norme ECMAScript 2015 (également appelée ES6), JavaScript a sérieusement changé et amélioré. C'est une très bonne nouvelle pour tous les développeurs JS. De plus, une nouvelle version d'ECMAScript est désormais publiée chaque année. Peut-être n'avez-vous pas prêté beaucoup d'attention à ce qui figurait dans la dernière version de la norme, qui a été publiée en juin 2019. L'auteur de l'article, dont nous publions la traduction aujourd'hui, veut dire en quelques mots les innovations de JavaScript et ce à quoi on peut s'attendre dans la prochaine version du standard ECMAScript.



Les opportunités dont les propositions sont dans la troisième phase d'approbation (étape 3) seront mentionnées ici. Cela signifie qu'ils sont susceptibles d'apparaître dans la prochaine version de la norme ECMAScript, mais cela ne peut pas être confirmé avec une certitude absolue. Voici un référentiel où vous pouvez trouver des informations sur les propositions qui sont à différents stades d'approbation.

Caractéristiques ECMAScript 2019 (ES10)


La norme ES10 possède de nombreuses nouvelles fonctionnalités. Nous n'en considérerons ici que quelques-uns. À savoir, quelques nouvelles méthodes de tableau.

▍ Méthode Array.prototype.flat


Cette méthode vous permet de créer des tableaux, qui incluent d'autres tableaux, plus "plats", en les "compressant" à un niveau de profondeur donné.

const array = [1, 2, [3, 4]]; array.flat(); // [1, 2, 3, 4]; 

Il s'agit d'une fonctionnalité très utile, en particulier dans les cas où vous devez travailler avec des tableaux imbriqués. Si la profondeur d'imbrication des tableaux dans la structure de données dépasse 1, un seul appel à la méthode flat ne peut pas rendre le tableau complètement «plat». Cette méthode accepte une depth paramètre facultative, qui vous permet de spécifier combien de niveaux d'imbrication la dimension du tableau traité doit être réduite.

 //   const crazyArray = [1, 2, [3, 4], [[5], [6, [7,8]]]]; crazyArray.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8]; // ,  flat,     

Plus la baie est profonde, plus il faudra de ressources informatiques pour la traiter. Veuillez noter qu'IE et Edge ne prennent pas en charge cette fonctionnalité.

▍ Méthode Array.prototype.flatMap


Cette méthode traite d'abord les éléments du tableau à l'aide de la fonction qui lui est transmise, puis convertit le tableau en une structure plate.

 const arr = ["it's Sunny in", "", "California"]; arr.flatMap(x => x.split(" ")); // ["it's","Sunny","in", "", "California"] 

La différence entre flatMap et flatMap est que vous pouvez passer votre propre fonction à la méthode flatMap qui convertit les éléments du tableau d'origine. En plus de cela, flatMap , contrairement à flat , «ne soulève» les éléments des tableaux que d'un niveau. Cette méthode renvoie un nouveau tableau. Cela peut être utile dans les cas où, avant de rendre un certain tableau «plat», vous devez en quelque sorte traiter ses éléments.

Nouvelles fonctionnalités JS à l'étape 3 de l'approbation


Au troisième stade de la coordination, il existe de nombreuses nouvelles propositions intéressantes pour étendre et améliorer la langue. Examinons certains d'entre eux.

▍ Séparateurs de chiffres


Cela vous est arrivé: écrivez un nombre long dans une variable et doutez de son orthographe correcte? La phrase en question nous permet de séparer les bits de nombres avec des traits de soulignement. Cela facilite le travail avec les nombres.

 1_000_000_000      // ,   101_475_938.38     //     -     let fee = 123_00;    // $123 (, , 12300 ) let fee = 12_300;    // $12,300 (  !) let amount = 12345_00; // 12,345 (,  , 1234500 ) let amount = 123_45.00; // 12345 (, -  ) let amount = 1_234_500; // 1,234,500 let budget = 1_000_000_000_000; //   `budget`?  - 1 ! // // : console.log(budget === 10 ** 12); // true 

Chaque développeur, après avoir accepté cette fonctionnalité, décidera lui-même d'utiliser ou non des séparateurs de décharge. Mais une chose est sûre: cette fonctionnalité peut réduire les inconvénients liés au calcul des chiffres des grands nombres.

▍Utilisation de l'attente au niveau supérieur du code


L'utilisation du mot-clé await au niveau supérieur du code permet aux modules d'agir comme de grandes fonctions asynchrones. En raison de cette fonctionnalité, les modules ECMAScript peuvent s'attendre à ce que certaines ressources apparaissent. Cela conduit au fait que les autres modules qui les importent attendront que le corps des modules importés soit prêt à fonctionner.

La raison de cette fonctionnalité est que lorsqu'un module est importé qui a une fonction déclarée avec le async , la sortie de cette fonction ne sera pas undefined .

L'exemple suivant montre deux fichiers. Il peut être undefined en output si la fonction est appelée avant que les tâches représentées par les promesses ne soient terminées.

 // awaiting.mjs import { process } from "./some-module.mjs"; const dynamic = import(computedModuleSpecifier); const data = fetch(url); export const output = process((await dynamic).default, await data); // usage.mjs import { output } from "./awaiting.mjs"; export function outputPlusValue(value) { return output + value } console.log(outputPlusValue(100)); setTimeout(() => console.log(outputPlusValue(100), 1000); 

Tout s'arrêtera dans le awaiting.js jusqu'à ce que les awaiting.js soient résolues en attendant.js.

▍Opérateur ?? et vérifier les valeurs uniquement sur null et indéfini


Peut-être, parmi toutes les offres de l'étape 3, c'est la plus utile. Nous devons souvent écrire quelque chose comme ceci:

 const obj = {  name: 'James' }; const name = obj.name || 'Jane'; // James 

Si obj.name est représenté par une valeur fausse, la chaîne Jane entre dans name . Par conséquent, le name ne sera pas quelque chose comme undefined . Mais le problème est qu'une chaîne vide dans ce cas sera perçue comme une fausse valeur. Si cela est pris en compte, ce code doit être réécrit comme suit:

 const name = (obj.name && obj.name !== '') || 'Jane'; 

Il n’est pas pratique d’écrire comme ça tout le temps. Opérateur ?? (deux points d'interrogation) permet de vérifier uniquement null valeurs null et undefined :

 const response = {  settings: {    nullValue: null,    height: 400,    animationDuration: 0,    headerText: '',    showSplashScreen: false  } }; const undefinedValue = response.settings.undefinedValue ?? 'some other default'; // : 'some other default' const nullValue = response.settings.nullValue ?? 'some other default'; // : 'some other default' const headerText = response.settings.headerText ?? 'Hello, world!'; // : '' const animationDuration = response.settings.animationDuration ?? 300; // : 0 const showSplashScreen = response.settings.showSplashScreen ?? true; // : false 

▍Opérateur?. et chaînes optionnelles


Cette suggestion est proche de celle qui vient d'être examinée, combinant null contrôles null et undefined . Il est connu que les utilisateurs de TypeScript sont intéressés par cette fonctionnalité.
Prenons un exemple:

 const city = country && country.city; // undefined  city   

Pour accéder à la propriété de la city d'un objet de country , vous devez vérifier l'existence de l'objet de country et l'existence de la propriété de la city .

En utilisant l'opérateur ?. (point d'interrogation et point) ce code peut être converti comme ceci:

 const city = country?.city; // undefined  city   

Cette fonctionnalité semble utile dans de telles situations:

 import { fetch } from '../yourFetch.js'; (async () => {  const res = await fetch();  // res && res.data && res.data.cities || undefined  const cities = res?.data?.cities; })(); 

▍ Méthode Promise.any


La méthode Promise.any accepte un objet Promise.any contenant des objets de promesse et retourne une promesse qui est résolue avec succès lorsqu'au moins un des objets de promesse qui lui sont passés est résolu avec succès. Si tous les objets promis sont rejetés, il renvoie un tableau contenant des informations sur les raisons de leur rejet.

Voici à quoi Promise.any avec la construction async / attendent:

 try {  const first = await Promise.any(promises);  //      . } catch (error) {  //    . } 

Voici la même chose implémentée à l'aide de promesses:

 Promise.any(promises).then(  (first) => {    //      .  },  (error) => {    //    .  } ); 

JavaScript a déjà des Promise.all , .allSettled , .race , mais une méthode similaire. any , n'était pas. En conséquence, nous avons une nouvelle opportunité qui complète les opportunités existantes et peut s'avérer utile dans certaines situations. Bien que cette proposition en soit déjà à la troisième étape d'approbation, elle pourrait ne pas être incluse dans la prochaine édition de la norme ECMAScript car elle nécessite des tests supplémentaires.

Résumé


Il existe de nombreuses suggestions intéressantes pour développer JavaScript qui en sont à la troisième étape de l'approbation. Il sera intéressant de les voir dans les normes ES11 et ES12. Bien sûr, il est peu probable que quiconque les utilise tous, mais certains d'entre eux trouveront certainement une large application et contribueront à la croissance de la qualité du code JS.

Chers lecteurs! Utilisez-vous déjà des fonctionnalités JavaScript qui sont presque prêtes à être incluses dans la prochaine version de la norme?


Source: https://habr.com/ru/post/fr475244/


All Articles