Skip to content

ECMAScript 2019 (10)

特性一览

去除字符串首尾空白

  • 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";