ECMAScript 2019(ES10)新特性简介
简介
ES10是ECMA协会在2019年6月发行的一个版本,因为是ECMAScript的第十个版本,所以也称为ES10.
今天我们讲解一下ES10的新特性。
ES10引入了2大特性和4个小的特性,我们接下来一一讲解。
Array的新方法flat和flatMap
在ES10中,给Array引入了两个新的方法,分别是flat和flatMap。
先来看一下flat。
我们看一下 Array.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.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的博客
欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
ECMAScript 2019(ES10)新特性简介的更多相关文章
- ECMAScript 2016(ES7)新特性简介
简介 自从ES6(ECMAScript 2015)在2015年发布以来,ECMAScript以每年一个版本的速度持续向前发展.到现在已经是ECMAScript 2020了. 每个版本都有一些新的特性, ...
- ECMAScript 2017(ES8)新特性简介
目录 简介 Async函数 共享内存和原子操作 Object的新方法 String的新方法 逗号可以添加到函数的参数列表后面了 简介 ES8是ECMA协会在2017年6月发行的一个版本,因为是ECMA ...
- ECMAScript 2018(ES9)新特性简介
目录 简介 异步遍历 Rest/Spread操作符和对象构建 Rest Spread 创建和拷贝对象 Spread和bject.assign() 的区别 正则表达式 promise.finally 模 ...
- ECMAScript 2020(ES11)新特性简介
目录 简介 动态imports import.meta export加强 BigInt matchAll() globalThis Promise.allSettled() ??操作符 ?.操作符 总 ...
- ECMAScript 2021(ES12)新特性简介
简介 ES12是ECMA协会在2021年6月发行的一个版本,因为是ECMAScript的第十二个版本,所以也称为ES12. ES12发行到现在已经有一个月了,那么ES12有些什么新特性和不一样的地方呢 ...
- javaScript ES7 ES8 ES9 ES10新特性
参考文献: https://tuobaye.com/2018/11/27/%E7%BB%86%E8%A7%A3JavaScript-ES7-ES8-ES9-%E6%96%B0%E7%89%B9%E6% ...
- ES6、ES7、ES8、ES9、ES10新特性
ES6新特性(2015) ES6的特性比较多,在 ES5 发布近 6 年(2009-11 至 2015-6)之后才将其标准化.两个发布版本之间时间跨度很大,所以ES6中的特性比较多. 在这里列举几个常 ...
- ES6新特性简介
ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...
- ECMAScript 6新特性简介
目录 简介 ECMAScript和JavaScript的关系 let和const 解构赋值 数组的扩展 函数的扩展 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言 ...
随机推荐
- 第47天打卡学习(单例模式 深入了解CAS 原子引用 各种锁的理解)
18彻底玩转 单例模式 饿汉式 DCL懒汉模式 探究! 饿汉式 package com.kuang.single; //饿汉式单例 //单例模式重要思想是构造器私有 public class Hun ...
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...
- FreeBSD 如何让csh像zsh那样具有命令错误修正呢
比如,,你用 emacs写c ,但你输完emacs ma按tab回车是,他会匹配所有ma开头的文件,而这个是忽略掉,也就是按tab时不会在有你忽略的东西,对编程之类的友好,不用再匹配到二进制..o之类 ...
- vue之better-scroll详解及封装
在我们的h5或移动端网页开发中,常常会需要实现滚动加载数据,等需求,而在开发中原生开发往往会带来意想不到的问题,因此我们引入better-scroll来帮我们实现流畅的滚动效果. 什么是better- ...
- 两种常见Content-type的方便理解
application/x-www-form-urlencoded:key=value键值对application/json:{name:"张三"} JSON字符串塞到请求的bod ...
- C语言入门--初来乍到
Hi,我是fish-studio,这是我写的第一篇博客,接下来我会以萌新的角度来与大家一起学习C语言,我也不是什么大佬,在我写的教程中会尽量详细的把我遇到的问题写出来,也会结合一些网上的文章进行编写, ...
- P2516 [HAOI2010]最长公共子序列 题解(LCS)
题目链接 最长公共子序列 解题思路 第一思路: 1.用\(length[i][j]\)表示\(a\)串的前\(i\)个字符与\(b\)串的前\(j\)个字符重叠的最长子串长度 2.用\(num[i][ ...
- Java8的新特性--并行流与串行流
目录 写在前面 Fork/Join框架 Fork/Join框架与传统线程池的区别 传统的线程池 Fork/Join框架 Fork/Join框架的使用 Java8中的并行流 写在前面 我们都知道,在开发 ...
- linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程
一.几个基本符号及其含义 之前看到别人写的一个shell脚本,有一个命令是:rm -f ${src_tmp_file} > /dev/null 2>&1 现在大概明白是什么意思了 ...
- 使用 DD 命令制作 USB 启动盘
Windows 下有很多很好用的 USB 启动盘制作工具,比如 Rufus,但是 MacOS 下这个类型的工具就少了很多,这里记录下在 MacOS 中用 DD 命令制作 Linux USB 启动盘的操 ...