翼度科技»论坛 编程开发 JavaScript 查看内容

ECMA 2019(ES10) 新特性

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
本章内容:

  • 行分隔符(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()方法最基本的作用就是数组降维
  1. var arr1 = [1, 2, [3, 4]];
  2. arr1.flat();
  3. // [1, 2, 3, 4]
  4. var arr2 = [1, 2, [3, 4, [5, 6]]];
  5. arr2.flat();
  6. // [1, 2, 3, 4, [5, 6]]
  7. var arr3 = [1, 2, [3, 4, [5, 6]]];
  8. arr3.flat(2);
  9. // [1, 2, 3, 4, 5, 6]
  10. //使用 Infinity 作为深度,展开任意深度的嵌套数组
  11. arr3.flat(Infinity);
  12. // [1, 2, 3, 4, 5, 6]
复制代码

  • 其次,还可以利用flat()方法的特性来去除数组的空项
  1. var arr4 = [1, 2, , 4, 5];
  2. arr4.flat(); // [1, 2, 4, 5]
复制代码
Array.prototype.flatMap()

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 map 和 深度值 1 的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些。 这里我们拿 map 方法与 flatMap 方法做一个比较。
  1. var arr1 = [1, 2, 3, 4];
  2. arr1.map((x) => [x * 2]);
  3. // [[2], [4], [6], [8]]
  4. arr1.flatMap((x) => [x * 2]);
  5. // [2, 4, 6, 8]
  6. // 只会将 flatMap 中的函数返回的数组 “压平” 一层
  7. arr1.flatMap((x) => [[x * 2]]);
  8. // [[2], [4], [6], [8]]
复制代码
4.String 的trimStart()方法和trimEnd()方法

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

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

  • 通过 Object.fromEntries, 可以将 Map 转化为 Object:
  1. const map = new Map([
  2.   ["foo", "bar"],
  3.   ["baz", 42],
  4. ]);
  5. const obj = Object.fromEntries(map);
  6. console.log(obj); // { foo: "bar", baz: 42 }
复制代码

  • 通过 Object.fromEntries, 可以将 Array 转化为 Object:
  1. const arr = [
  2.   ["0", "a"],
  3.   ["1", "b"],
  4.   ["2", "c"],
  5. ];
  6. const obj = Object.fromEntries(arr);
  7. console.log(obj); // { 0: "a", 1: "b", 2: "c" }
复制代码
6.Symbol.prototype.description

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

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

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

举报 回复 使用道具