书格前端

ES2019的语言特性


ES2019的语言特性

关于ECMAScript 2019规范的新增特性

可选的捕获绑定

在这之前你肯定使用过try...catch

try {
    // 抛出异常
} catch (error) {
    // 异常处理
}

如果你不需要在捕获语句中绑定这个error参数呢?现在可以忽略这个参数绑定了。

try {
    // 抛出异常
} catch {
    // 异常处理
}

JSON超集

这项特性相对于一个新的语言特性来讲,更像是一个规范的更新—它是完全向下兼容的。尽管ECMAScript文档称JSON是JSON.parse()的子集,实际上JSON标准并不是ECMAScript的子集。JSON可以包含非转义换行分隔符(U+2028)和段落分隔符(U+2029),但是ECMAScript必须要通过转义后才能添加到字符串中。这可能会引起bug或者给规范添加不必要的复杂度。这个提案引入了一些ECMAScript字符串文本常量和JSON字符串文本常量的一致性。JSON标准现在是ECMAScript的合法子集。

Symbol.prototype.description

为了改善调试体验,Symbol可以在创建时指定一个可选的描述信息。之前我们通常是通过Symbol.prototype.toString()返回一个包含在Symbol()字符串内的描述来进行访问。使用ECMAScript 2019我们可以更加直观的做这件事,Symbol.prototype.description仅返回一个描述而不包含任何装饰。

const foo = Symbol("My super symbol");

foo.toString();
// Symbol(My super symbol)

foo.description;
// My super symbol

Function.prototype.toString 修订

toString()的实现被再次修订,并且标准化返回实现独立的字符串(定义函数实现的源码)。这是在一个已经是较大提案上的增量式更新,规则在Function.prototype.toString提案介绍有很好的定义。

function hi(name) {
  return `Hi ${name}`;
}

hi.toString();
// function hi(name) {
//   return `Hi ${name}`;
// }
Array.isArray.toString();
// function isArray() { [native code] }

Object.fromEntries

一个非常便利的方法用来转换一个键值对列表到一个对象中。

const arr = [["name", "Pawel"], ["surname", "Grzybek"], ["age", 31]];
const obj = Object.fromEntries(arr);
// {name: "Pawel", surname: "Grzybek", age: 31}

符合语法规则的JSON.stringify

这个向下兼容的改变阻止JSON.stringify()返回无法在UTF-8标准中表示的编码字符串。

// 之前
JSON.stringify("\u{D800}");
// '"�"'

// 之后
JSON.stringify("\u{D800}");
// "\ud800"

String.prototype.trimStart/String.prototype.trimEnd

String.prototype.trim()已经在标准中很多年了。这个提案引入了String.prototype.trimStart()String.prototype.trimEnd()。它们实际上添加到浏览器中也有很多年了,现在是时候把它们标准化。

"   javascript   ".trim();
// "javascript"

"   javascript   ".trimStart();
// "javascript   "

"   javascript   ".trimEnd();
// "   javascript"

Array.prototype.flat / Array.prototype.flatMap

你还记得SmooshGate? Array.prototype.flat()将数组递归展开至指定深度。默认深度是1。让我们看一些实例:

[1, 2, [3, 4, [5, 6]]].flat();
// [ 1, 2, 3, 4, [ 5, 6 ] ]

[1, 2, [3, 4, [5, 6]]].flat(2);
// [ 1, 2, 3, 4, 5, 6 ]

Array.prototype.flatMap()返回一个Array.prototpye.map()方法的展开结果。可以想象一下arr.map(mapper.flat(1)

[1, 2, 3].flatMap(item => [item, item * 100]);
// [1, 100, 2, 200, 3, 300]

Array.prototype.sort稳定性

在这之前,数组中超过10个元素会使用一个不稳定的快排算法。 往前发展,这个功能现在被稳定的TimSort算法。如果你很好奇,强烈推荐你看看V8团队Simon Zünd发的文章在V8中的排序