关于javascript:ECMAScript-2019ES10新特性简介

8次阅读

共计 3746 个字符,预计需要花费 10 分钟才能阅读完成。

简介

ES10 是 ECMA 协会在 2019 年 6 月发行的一个版本,因为是 ECMAScript 的第十个版本,所以也称为 ES10.

明天咱们解说一下 ES10 的新个性。

ES10 引入了 2 大个性和 4 个小的个性,咱们接下来一一解说。

Array 的新办法 flat 和 flatMap

在 ES10 中,给 Array 引入了两个新的办法,别离是 flat 和 flatMap。

先来看一下 flat。

咱们看一下 Array<T>.prototype.flat() 的定义:

.flat(depth = 1): any[]

flat 的作用是将 Array 中的 Array 中的内容取出来,放到最顶层 Array 中。咱们能够传入一个 depth 参数,示意的是须要 flat 的 Array 层级。

举个例子:

> [1,2, [3,4], [[5,6]] ].flat(0) // no change
[1, 2, [ 3, 4], [[ 5, 6] ] ]

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

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

当 depth= 0 的时候,就示意不会对 Array 内置的 Array 进行 flat 操作。

咱们再看一下 Array<T>.prototype.flatMap() 的定义:

 .flatMap<U>(callback: (value: T, index: number, array: T[]) => U|Array<U>,
  thisValue?: any
): U[]

flatMap 是 map 和 flat 的联合,上面的两个操作是等价的:

arr.flatMap(func)
arr.map(func).flat(1)

咱们看几个 flatMap 的例子:

> ['a', 'b', 'c'].flatMap(x => x)
['a', 'b', 'c']
> ['a', 'b', 'c'].flatMap(x => [x])
['a', 'b', 'c']
> ['a', 'b', 'c'].flatMap(x => [[x]])
[[ 'a'], ['b'], ['c'] ]

> ['a', 'b', 'c'].flatMap((x, i) => new Array(i+1).fill(x))
['a', 'b', 'b', 'c', 'c', 'c']

Object 的新办法 fromEntries

Object.fromEntries 的次要作用就是通过给定的 [key,value],来创立新的 Object 对象。

var newObj =  Object.fromEntries([['foo',1], ['bar',2]]);
console.log(newObj);
{foo: 1, bar: 2}

下面例子中,咱们通过给定的两个 key-value 对,创立了新的 object 对象。

和 fromEntries 相同的办法,就是 Object.entries, 用来遍历对象属性。

还是刚刚的例子,咱们再调用一下 Object.entries 办法:

console.log(Object.entries(newObj));
[[ 'foo', 1], ['bar', 2] ]

String 的新办法 trimStart 和 trimEnd

JS 中曾经有了 trim 的办法,能够打消 String 前后的空格。

> 'abc'.trim()
'abc'

但有时候可能须要打消后面或者前面的空格,ES10 引入了 trimStart 和 trimEnd 办法:

> 'abc'.trimStart()
'abc'
> 'abc'.trimEnd()
'abc'

留神,有些浏览器可能曾经有了 trimLeft 和 trimRight 办法,在 EMCAScript 标准中,他们和 trimStart,trimEnd 是等价的。

可拜访的 Symbol 的 description 属性

咱们在创立 Symbol 的时候,能够传入一个 description 作为参数来构建 Symbol:

const sym = Symbol('www.flydean.com');

在 ES10 之前,咱们想要拜访 Symbol 的 description 是这样做的:

console.log(String(sym));
//Symbol(www.flydean.com)

当初咱们能够间接通过 description 属性来拜访了:

console.log(sym.description);
//www.flydean.com

可疏忽的 catch 参数

在传统的写法中,catch 是要承受一个 error 参数的:

try {// ···} catch (error) {// ···}

但有时候咱们曾经晓得这个异样是不重要的,或者说,咱们想疏忽掉这个异样,那么在 ES10 中,咱们能够省略这个 error 参数:

try {// ···} catch {// ···}

Array 的稳固排序

Array 有个 sort 性能,能够依据元素内容进行排序。

ES10 中引入了稳固排序的概念,也就是说如果排序的 key 是雷同的,那么这些雷同 key 的程序在排序中是不会发生变化的。

举个例子:

const arr = [{ key: 'b', value: 1},
  {key: 'a', value: 2},
  {key: 'b', value: 3},
];
arr.sort((x, y) => x.key.localeCompare(y.key, 'en-US'));

咱们依据 key 来进行排序,从而让 a,排在 b 后面,然而两个 key= b 的元素地位是不会变动的。

console.log(arr);
[{ key: 'a', value: 2},
  {key: 'b', value: 1},
  {key: 'b', value: 3}
]

JSON.stringify

JSON 是一个很不便的数据传输格局,它不像 XML 那么简单,长处就是体积小,便于传输。

依据 RFC3629 的标准,在公共环境中传输 JSON,必须应用 UTF- 8 进行编码。

JSON text exchanged between systems that are not part of a closed
ecosystem MUST be encoded using UTF-8 [RFC3629].

在讲 JSON.stringify 之前,咱们先回顾一下 ES6 中的 Escape sequences。

ES6 中有三种 escape:

  1. Hex escape:16 进制 escape。本义的是 2 位的 16 进制。
  > '\x7A' === 'z'
  true
  1. Unicode escape:本义的是 4 位的 16 进制
 > '\u007A' === 'z'
  true
  1. Unicode code point escape:本义的是 1 位或者多位的 16 进制
  > '\u{7A}' === 'z'
  true

最初一个本义是在 ES6 中引入的。

unicode 字符集最初是要存储到文件或者内存外面的,间接存储的话,空间占用太大。那怎么存呢?应用固定的 1 个字节,2 个字节还是用变长的字节呢?于是咱们依据编码方式的不同,分成了 UTF-8,UTF-16,UTF-32 等多种编码方式。

其中 UTF- 8 是一种变长的编码方案,它应用 1 - 4 个字节来存储。UTF-16 应用 2 个或者 4 个字节来存储。

而 UTF-32 是应用 4 个字节来存储。这三种编码方式中,只有 UTF- 8 是兼容 ASCII 的,这也是为什么国内上 UTF- 8 编码方式比拟通用的起因(毕竟计算机技术都是西方人搞进去的)。

咱们晓得在 Unicode 编码中,U+D800 到 U +DFFF 的这些字符是预留给 UTF-16 应用,如果咱们输出的是这个范畴内的字符的话,是无奈被转换成为 UTF- 8 格局的。

这就是原来的 JSON.stringify 可能呈现的问题。

在 ES10 中,JSON.stringify 对于这些不可转换成 UTF- 8 的字符,间接返回对应的 code unit escape sequences。

console.log(JSON.stringify('\u{D800}'));
"\ud800"

JSON 被归为 ECMAScript 的子集

在之前,JSON 不是 ECMAScript 的子集,从而导致有些能够在 JSON 中蕴含的字符,不可能在 ECMAScript 的字面量中呈现,比方 U +2028 和 U +2029:

const sourceCode = '"\u2028"';
eval(sourceCode); // SyntaxError

JSON.parse(json); // OK

这次扭转之后,咱们在编码的时候就不须要再去辨别是 JSON 还是 ECMAScript 了。

Function 的 toString 办法

在 ES10 中,如果 Function 能够通过以 ECMAScript 源代码的形式示意的话,则 toString 会间接返回这个函数的代码:

> class C {foo() {/*hello*/} }
> C.prototype.foo.toString()
'foo() { /*hello*/}'

如果是一些 native 的办法,比方底层 c 或者 c ++ 实现的代码,则间接返回 [native code]:

> Math.pow.toString()
'function pow() { [native code] }'

本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/ecmascript-10/

本文起源:flydean 的博客

欢送关注我的公众号:「程序那些事」最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

正文完
 0