ECMAScript 2019 (10)
特性一览
- 去除字符串首尾空白
- catch 可选异常绑定
- Array.flat()
- Array.flatMap()
- Object.fromEntries()
- Array.Sort()更加稳定
- JSON.stringify()加强格式转化
- Function.toString()重新修订
- Symbol.description
- 允许在字符串字面量中使用分隔符
去除字符串首尾空白
- trimStart()
js
let text = " Hello World! ";
text.trimStart(); //"Hello World! " //[!code focus]
- trimEnd()
js
let text = " Hello World! ";
text.trimEnd(); //" Hello World!" //[!code focus]
catch 可选异常绑定
ES2019 之前的 try...catch...
js
try {
// code
} catch (err) {
// code
}
ES2019 允许不绑定异常参数
js
try {
// code
} catch {
// code
}
Array.flat()
创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。
js
const arr1 = [0, 1, 2, [3, 4]];
arr1.flat(); // Array [0, 1, 2, 3, 4] //[!code focus]
const arr2 = [0, 1, 2, [[[3, 4]]]];
arr2.flat(3); // Array [0, 1, 2, 3, 4] //[!code focus]
Array.flatMap()
对数组中的每个元素应用给定的回调函数,然后将结果展开一级,返回一个新数组。
它等价于在调用 map() 方法后再调用深度为 1 的 flat() 方法(arr.map(...args).flat()),但比分别调用这两个方法稍微更高效一些。
js
const myArr = [1, 2, 3, 4, 5, 6];
myArr.flatMap((x) => x * 2); //Array(6) [ 2, 4, 6, 8, 10, 12 ] //[!code focus]
Object.fromEntries()
将键值对列表转换为一个对象。
js
const entries = new Map([
["foo", "bar"],
["baz", 42],
]);
Object.fromEntries(entries); //Object { foo: "bar", baz: 42 } //[!code focus]
Array.Sort()更加稳定
自 EcmaScript 2019 起,要求 Array.prototype.sort
为稳定排序。
假设有一个包含学生名字和年级的列表:
js
const students = [
{ name: "Alex", grade: 15 },
{ name: "Devlin", grade: 15 },
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
];
对这个数组执行按照 grade
升序排序:
js
students.sort((a, b) => a.grade - b.grade);
EcmaScript 2019 以前没有要求稳定性,意味着可能会得到以下结果:
js
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Devlin", grade: 15 }, // 没有维持原先的顺序
{ name: "Alex", grade: 15 }, // 没有维持原先的顺序
];
EcmaScript 2019 以后,会得到以下结果
grade
相同的学生(如 Alex 和 Devlin)会维持调用排序之前的顺序,这是稳定排序所确保的。
js
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Alex", grade: 15 }, // grade 相同时维持原先的顺序(稳定排序)
{ name: "Devlin", grade: 15 }, // grade 相同时维持原先的顺序(稳定排序)
];
JSON.stringify()加强格式转化
ECMAScript 2019 以前, JSON
无法正常序列化带有\
编码的字符(变成���
)。
ECMAScript 2019 进行了加强
js
JSON.stringify("\u26D4");
Function.toString()重新修订
返回一个表示当前函数源代码的字符串。
js
function sum(a, b) {
return a + b;
}
/**
* "function sum(a, b) {
* return a + b;
* }"
*/
sum.toString();
Symbol.description
返回 Symbol 对象的可选描述的字符串。
js
Symbol("desc").toString(); // "Symbol(desc)"
Symbol("desc").description; // desc //[!code focus]
允许在字符串字面量中使用分隔符
解决了在字符串字面量中使用\
的问题
js
let text = "\u2028";