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的合法子集。
- JSON superset proposal
- [作者: Richard Gibson, Mark Miller and Mathias Bynens]
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
- Symbol.prototype.description proposal
- [作者: Michael Ficarra]
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] }
Function.prototype.toString
提案- [作者: Michael Ficarra]
Object.fromEntries
一个非常便利的方法用来转换一个键值对列表到一个对象中。
const arr = [["name", "Pawel"], ["surname", "Grzybek"], ["age", 31]];
const obj = Object.fromEntries(arr);
// {name: "Pawel", surname: "Grzybek", age: 31}
- Object.fromEntries 提案
- [作者: Darien Maillet Valentine]
符合语法规则的JSON.stringify
这个向下兼容的改变阻止JSON.stringify()
返回无法在UTF-8标准中表示的编码字符串。
// 之前
JSON.stringify("\u{D800}");
// '"�"'
// 之后
JSON.stringify("\u{D800}");
// "\ud800"
- Well-formed JSON.stringify 提案
- [作者: Richard Gibson, Mathias Bynens]
String.prototype.trimStart/String.prototype.trimEnd
String.prototype.trim()
已经在标准中很多年了。这个提案引入了String.prototype.trimStart()
和String.prototype.trimEnd()
。它们实际上添加到浏览器中也有很多年了,现在是时候把它们标准化。
" javascript ".trim();
// "javascript"
" javascript ".trimStart();
// "javascript "
" javascript ".trimEnd();
// " javascript"
- String.prototype.trimStart / String.prototype.trimEnd提案
- [作者: Sebastian Markbåge, Mathias Bynens]
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.flat / Array.prototype.flatMap 提案
- [作者: Brian Terlson, Michael Ficarra, Mathias Bynens]
Array.prototype.sort稳定性
在这之前,数组中超过10个元素会使用一个不稳定的快排算法。 往前发展,这个功能现在被稳定的TimSort算法。如果你很好奇,强烈推荐你看看V8团队Simon Zünd发的文章在V8中的排序。
- Array.prototype.sort 稳定性提案
- [Mathias Bynens]