努力的阿高 发表于 2024-5-24 22:40:43

ECMA 2019(ES10) 新特性

本章内容:

[*]行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与 JSON 匹配
[*]更加友好的 JSON.stringify
[*]新增了 Array 的flat()方法和flatMap()方法
[*]新增了 String 的trimStart()方法和trimEnd()方法
[*]Object.fromEntries()
[*]Symbol.prototype.description
[*]Function.prototype.toString()现在返回精确字符,包括空格和注释
[*]简化try {} catch {},修改 catch 绑定
[*]Legacy RegEx
[*]私有的实例方法和访问器
1.行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与 JSON 匹配

以前,这些符号在字符串文字中被视为行终止符,因此使用它们会导致 SyntaxError 异常。
2.更加友好的 JSON.stringify

如果输入 Unicode 格式但是超出范围的字符,在原先 JSON.stringify 返回格式错误的 Unicode 字符串。现在实现了一个改变 JSON.stringify 的第 3 阶段提案,因此它为其输出转义序列,使其成为有效 Unicode(并以 UTF-8 表示)
3.新增 Array 的flat()方法和flatMap()方法

flat()和flatMap()本质上就是是归纳(reduce) 与 合并(concat)的操作。
Array.prototype.flat()

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
flat()方法最基本的作用就是数组降维
var arr1 = ];
arr1.flat();
//

var arr2 = ]];
arr2.flat();
// ]

var arr3 = ]];
arr3.flat(2);
//

//使用 Infinity 作为深度,展开任意深度的嵌套数组
arr3.flat(Infinity);
//

[*]其次,还可以利用flat()方法的特性来去除数组的空项
var arr4 = ;
arr4.flat(); // Array.prototype.flatMap()

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 map 和 深度值 1 的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些。 这里我们拿 map 方法与 flatMap 方法做一个比较。
var arr1 = ;

arr1.map((x) => );
// [, , , ]

arr1.flatMap((x) => );
//

// 只会将 flatMap 中的函数返回的数组 “压平” 一层
arr1.flatMap((x) => []);
// [, , , ]4.String 的trimStart()方法和trimEnd()方法

新增的这两个方法很好理解,分别去除字符串首尾空白字符,这里就不用例子说声明了。
5.Object.fromEntries()

Object.entries()方法的作用是返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
而Object.fromEntries() 则是 Object.entries() 的反转。
Object.fromEntries() 函数传入一个键值对的列表,并返回一个带有这些键值对的新对象。这个迭代参数应该是一个能够实现@iterator 方法的的对象,返回一个迭代器对象。它生成一个具有两个元素的类似数组的对象,第一个元素是将用作属性键的值,第二个元素是与该属性键关联的值。

[*]通过 Object.fromEntries, 可以将 Map 转化为 Object:
const map = new Map([
["foo", "bar"],
["baz", 42],
]);
const obj = Object.fromEntries(map);
console.log(obj); // { foo: "bar", baz: 42 }

[*]通过 Object.fromEntries, 可以将 Array 转化为 Object:
const arr = [
["0", "a"],
["1", "b"],
["2", "c"],
];
const obj = Object.fromEntries(arr);
console.log(obj); // { 0: "a", 1: "b", 2: "c" }6.Symbol.prototype.description

通过工厂函数 Symbol()创建符号时,您可以选择通过参数提供字符串作为描述:
const sym = Symbol("The description");以前,访问描述的唯一方法是将符号转换为字符串:
assert.equal(String(sym), "Symbol(The description)");现在引入了 getter Symbol.prototype.description 以直接访问描述:
assert.equal(sym.description, "The description");Function.prototype.toString()

现在返回精确字符(源代码),包括空格和注释
function /* comment */ foo /* another comment */() {}
// 之前不会打印注释部分
console.log(foo.toString()); // function foo(){}
// ES2019 会把注释一同打印
console.log(foo.toString()); // function /* comment */ foo /* another comment */ (){}
// 箭头函数
const bar /* comment */ = /* another comment */ () => {};
console.log(bar.toString()); // () => {}修改 catch 绑定

在 ES10 之前,我们必须通过语法为 catch 子句绑定异常变量,无论是否有必要。很多时候 catch 块是多余的。 ES10 提案使我们能够简单的把变量省略掉。
不算大的改动。
之前是:
try {
// do sth
} catch (e) {
// do sth
}现在是:
try {
// do sth
} catch {
// do sth
}
来源:https://www.cnblogs.com/guojikun/p/18206445
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ECMA 2019(ES10) 新特性