Maison > interface Web > js tutoriel > 5 nouvelles fonctionnalités de ES10

5 nouvelles fonctionnalités de ES10

Libérer: 2020-06-15 17:11:24
avant
2626 Les gens l'ont consulté

Cette année, ECMAScript 2019 (ES2019 en abrégé) sortira. Les nouvelles fonctionnalités incluent Object.fromEntries(), trimStart(), trimEnd(), flat(), flatMap(), l'attribut de description des objets symboles, la liaison catch facultative, etc.

5 nouvelles fonctionnalités de ES10

1. Object.fromEntries()

En JavaScript, convertir des données d'un format à un autre Très courant. Pour faciliter la conversion d'objets en tableaux, ES2017 a introduit la méthode Object.entrie(). Cette méthode prend un objet comme paramètre et renvoie un tableau des propres paires de propriétés énumérables de chaîne-clé de l'objet sous la forme [clé, valeur]. Par exemple :

const obj = {one: 1, two: 2, three: 3};

console.log(Object.entries(obj));    
// => [["one", 1], ["two", 2], ["three", 3]]
Copier après la connexion

Mais que se passe-t-il si nous voulons faire l'inverse et convertir la liste de paires clé-valeur en objet ? Certains langages de programmation, comme Python, fournissent la fonction dict() à cet effet. Il existe également la fonction _.fromPairs dans Underscore.js et Lodash.

ES2019 a introduit la méthode Object.fromEntries() pour apporter des fonctionnalités similaires à JavaScript. Cette méthode statique vous permet de convertir facilement une liste de paires clé-valeur en un objet :

const myArray = [['one', 1], ['two', 2], ['three', 3]];
const obj = Object.fromEntries(myArray);

console.log(obj);    // => {one: 1, two: 2, three: 3}
Copier après la connexion

Comme vous le souhaitez. peut voir, Object.fromEntries() fait exactement le contraire de Object.entries(). Alors qu'il était auparavant possible d'implémenter la même fonctionnalité d'Object.fromEntries(), la façon dont elle était implémentée était quelque peu compliquée :

const myArray = [['one', 1], ['two', 2], ['three', 3]];
const Array.from(myArray).reduce((acc, [key, val]) 
=> Object.assign(acc, {[key]: val}), {})

console.log(obj);    // => {one: 1, two: 2, three: 3}
Copier après la connexion

N'oubliez pas que l'argument passé à Object.fromEntries() peut être n'importe quel objet qui implémente le protocole itérable, tant qu'il renvoie un objet de type tableau à deux éléments.

Par exemple, dans le code suivant, Object.fromEntries() prend un objet Map comme paramètre et crée un nouvel objet dont les clés et les valeurs correspondantes sont données par les paires dans la Map :

const map = new Map();
map.set('one', 1);
map.set('two', 2);

const obj = Object.fromEntries(map);

console.log(obj);    // => {one: 1, two: 2}
Copier après la connexion

La méthode Object.fromEntries() est également très utile pour convertir des objets, considérez le code suivant :

const obj = {a: 4, b: 9, c: 16};

// 将对象转换为数组
const arr = Object.entries(obj);

// 计算数字的平方根
const map = arr.map(([key, val]) => [key, Math.sqrt(val)]);

// 将数组转换回对象
const obj2 = Object.fromEntries(map);

console.log(obj2);  // => {a: 2, b: 3, c: 4}
Copier après la connexion

Le code ci-dessus convertit la valeur de l'objet en sa racine carrée. Pour ce faire, il convertit d'abord l'objet en tableau, puis utilise la méthode map() pour obtenir la racine carrée des valeurs du tableau. Le résultat est un tableau qui peut être reconverti en objet.

Un autre cas d'utilisation d'Object.fromEntries() consiste à gérer la chaîne de requête de l'URL, comme le montre cet exemple

const paramsString = 'param1=foo&param2=baz';
const searchParams = new URLSearchParams(paramsString);

Object.fromEntries(searchParams);    // => {param1: "foo", param2: "baz"}
Copier après la connexion

Dans ce code, la chaîne de requête sera transmise à URLSearchParams( ) Constructeur. La valeur de retour (c'est-à-dire l'instance de l'objet URLSearchParams) est ensuite transmise à la méthode Object.fromEntries() et le résultat est un objet contenant chaque paramètre en tant que propriété. La méthode

Object.fromEntries() est actuellement une proposition de phase 4, ce qui signifie qu'elle est prête à être incluse dans la norme ES2019.

2. trimStart() et trimEnd()

Les méthodes trimStart() et trimEnd() sont implémentées de la même manière que trimLeft() et trimRight(). Ces méthodes sont actuellement en phase 4 et seront ajoutées à la spécification pour s'aligner sur padStart() et padEnd(), jetez un œil à quelques exemples :

const str = "   string   ";

// es2019
console.log(str.trimStart());    // => "string   "
console.log(str.trimEnd());      // => "   string"

// 相同结果
console.log(str.trimLeft());     // => "string   "
console.log(str.trimRight());    // => "   string"
Copier après la connexion

Pour la compatibilité web, trimLeft() et trimRight( ) resteront comme alias pour trimStart() et trimEnd().

3. flat() et flatMap()

La méthode flat() peut aplatir un tableau multidimensionnel en un tableau unidimensionnel

const arr = ['a', 'b', ['c', 'd']];
const flattened = arr.flat();

console.log(flattened);    // => ["a", "b", "c", "d"]
Copier après la connexion

Auparavant, nous utilisions souvent réduire() ou concat() pour aplatir les tableaux multidimensionnels :

const arr = ['a', 'b', ['c', 'd']];
const flattend = [].concat.apply([], arr);

// or
// const flattened =  [].concat(...arr);

console.log(flattened);    // => ["a", "b", "c", "d"]
Copier après la connexion

Notez que s'il y a des valeurs nulles dans le tableau fourni, elles seront supprimées :

const arr = ['a', , , 'b', ['c', 'd']];
const flattened = arr.flat();

console.log(flattened);    // => ["a", "b", "c", "d"]
Copier après la connexion

flat() Accepte également un paramètre facultatif qui spécifie le nombre de niveaux auxquels le tableau imbriqué doit être aplati. Si aucun argument n'est fourni, la valeur par défaut de 1 sera utilisée : la méthode

const arr = [10, [20, [30]]];

console.log(arr.flat());     // => [10, 20, [30]]
console.log(arr.flat(1));    // => [10, 20, [30]]
console.log(arr.flat(2));    // => [10, 20, 30]
Copier après la connexion

flatMap() combine map() et flat() en une seule méthode. Il crée d'abord un nouveau tableau en utilisant la valeur de retour de la fonction fournie, puis concatène tous les éléments du sous-tableau de ce tableau. Voici un exemple :

const arr = [4.25, 19.99, 25.5];

console.log(arr.map(value => [Math.round(value)]));    
// => [[4], [20], [26]]

console.log(arr.flatMap(value => [Math.round(value)]));    
// => [4, 20, 26]
Copier après la connexion

Le tableau sera aplati à un niveau de profondeur de 1. Si vous souhaitez supprimer des éléments du résultat, renvoyez simplement un tableau vide :

const arr = [[7.1], [8.1], [9.1], [10.1], [11.1]];

// do not include items bigger than 9
arr.flatMap(value => {
  if (value >= 10) {
    return [];
  } else {
    return Math.round(value);
  }
});  

// returns:
// => [7, 8, 9]
Copier après la connexion

sauf pour l'actuel élément en cours de traitement De plus, la fonction de rappel recevra l'index de l'élément et une référence au tableau lui-même. Les méthodes flat() et flatMap() sont actuellement au stade 4.

4. Attribut Description de l'objet Symbole

Lors de la création d'un symbole, vous pouvez y ajouter une description (description) à des fins de débogage. Il est parfois utile d'avoir un accès direct à la description dans le code.

ES2019 ajoute une description d'attribut en lecture seule à l'objet Symbol, qui renvoie une chaîne contenant la description du symbole.

let sym = Symbol('foo');
console.log(sym.description);    // => foo

sym = Symbol();
console.log(sym.description);    // => undefined

// create a global symbol
sym = Symbol.for('bar');
console.log(sym.description);    // => bar
Copier après la connexion

5. Catch facultatif

Le catch dans l'instruction try catch est parfois inutile Considérez le code suivant :

try {
  // 使用浏览器可能尚未实现的功能
} catch (unused) {
  // 这里回调函数中已经帮我们处理好的错误
}
Copier après la connexion

Ce code Les informations. dans le rappel catch n'est pas utile. Mais il est écrit de cette façon pour éviter les erreurs SyntaxError. ES2019 peut omettre les crochets autour de catch :

try {
  // ...
} catch {
  // ....
}
Copier après la connexion

Aussi : la méthode String.prototype.matchAll

matchAll() d'ES2020 est une proposition de phase 4 d'ES2020, qui renvoie toutes les correspondances pour les expressions régulières (objet Iterator y compris la capture de groupes).

Pour être cohérent avec la méthode match(), TC39 a choisi "matchAll" au lieu d'autres noms suggérés tels que "matches" ou "scan" de Ruby. Prenons un exemple simple :

const re = /(Dr\. )\w+/g;
const str = 'Dr. Smith and Dr. Anderson';
const matches = str.matchAll(re);

for (const match of matches) {
  console.log(match);
}

// logs:
// => ["Dr. Smith", "Dr. ", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined]
// => ["Dr. Anderson", "Dr. ", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
Copier après la connexion

Le groupe de capture dans cette expression régulière correspond aux caractères "Dr" suivis d'un point et d'un espace. w+ correspond à n’importe quel caractère de mot une ou plusieurs fois. Et l'indicateur g demande au moteur de rechercher des modèles dans toute la chaîne.

Auparavant, il fallait utiliser la méthode exec() en boucle pour arriver au même résultat, ce qui n'était pas très efficace :

const re = /(Dr\.) \w+/g;
const str = 'Dr. Smith and Dr. Anderson';
let matches;

while ((matches = re.exec(str)) !== null) {
  console.log(matches);
}

// logs:
// => ["Dr. Smith", "Dr.", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined]
// => ["Dr. Anderson", "Dr.", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
Copier après la connexion

重要的是要注意尽管match() 方法可以与全局标志g一起使用来访问所有匹配,但它不提供匹配的捕获组或索引位置。 比较以下代码:

const re = /page (\d+)/g;
const str = 'page 2 and page 10';

console.log(str.match(re));    
// => ["page 2", "page 10"]

console.log(...str.matchAll(re)); 
// => ["page 2", "2", index: 0, input: "page 2 and page 10", groups: undefined] 
// => ["page 10", "10", index: 11, input: "page 2 and page 10", groups: undefined]
Copier après la connexion

总结

在这篇文章中,我们仔细研究了 ES2019 中引入的几个关键特性,包括Object.fromEntries(),trimStart(), trimEnd(), flat(), flatMap(),symbol 对象的description 属性以及可选的catch 。

更多相关知识请关注JavaScript视频教程栏目

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:javanx.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal