共计 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:
- Hex escape:16 进制 escape。本义的是 2 位的 16 进制。
> '\x7A' === 'z'
true
- Unicode escape:本义的是 4 位的 16 进制
> '\u007A' === 'z'
true
- 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 的博客
欢送关注我的公众号:「程序那些事」最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!