写在前面的话标准非实际情况。
ECMAScript 2017,ECMA-262 标准版本的第8版(通常称为ES2017或ES8),于 2017 年 6 月完成。
ECMAScript 2017 introduced Async Functions, Shared Memory, and Atomics along with smaller language and library enhancements, bug fixes, and editorial updates. Async functions improve the asynchronous programming experience by providing syntax for promise-returning functions. Shared Memory and Atomics introduce a new memory model that allows multi-agent programs to communicate using atomic operations that ensure a well-defined execution order even on parallel CPUs. This specification also includes new static methods on Object: Object.values, Object.entries, and Object.getOwnPropertyDescriptors.
与 ES6 相比,ES8 是 JavaScript 的一个小版本,但它仍然引入了非常有用的功能:
- 字符串填充(padStart 和 padEnd)
- Object.values
- Object.entries
- Object.getOwnPropertyDescriptors()
- 函数参数列表和调用中的尾随逗号
- Async Functions (异步函数)
- 共享内存 和 Atomics
字符串填充(padStart 和 padEnd)
如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。
1 |
padStart(targetLength [, padString]) |
一共接受两个参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。
1 |
'x'.padStart(5, 'ab') // 'ababx' |
Object.values
这个方法返回一个包含所有对象自身属性值的数组
1 |
const person = { name: 'Fred', age: 87 } |
也适用于数组:
1
2
const people = ['Fred', 'Tony']
Object.values(people) // ['Fred', 'Tony']
Object.entries
方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
1 |
const person = { name: 'Fred', age: 87 } |
也适用于数组
1
2
const people = ['Fred', 'Tony']
Object.entries(people) // [['0', 'Fred'], ['1', 'Tony']]
Object.getOwnPropertyDescriptors()
返回对象的所有自有(非继承的)属性描述符。
描述符是属性(property) 的一组特性(attributes),它由以下的子集组成:
- value:属性的值
- writable:true 表示改属性可以被修改
- get:属性的 getter 函数,在读取属性时调用
- set:属性的 setter 函数,在属性设置值时调用
- configurable:如果为 false ,则不能删除属性,也不能更改任何属性,但值除外
- enumerable:如果属性是可枚举的,则为 true
该方法的引入目的,主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题。
1 |
const shallowMerge = (target, source) => Object.defineProperties( |
另外还有 Object.create 和 对象继承 的问题,请查看更多信息。
函数参数列表和调用中的尾随逗号
此功能允许在函数声明和函数调用中使用尾随逗号,此功能在参数换行显示的时候比较明显
1 |
function clownsEverywhere( |
如果没有后面的都好,修改代码的时候就会显示添加逗号的那一行也发生了变动。这看上去有点冗余,因此新的语法允许定义和调用时,尾部直接有一个逗号。
Async Functions (异步函数)
ES2017 引入了 Async Functions (异步函数) 的概念,这是该版本中引入的最重要的变化。
当 Promise 在 ES2015 中引入时,它们的目的是解决异步代码的问题,并且他们做到了。但在 ES2015 和 ES2017 相间隔的两年时间里,很明显, Promise 并不是最终的解决方案。
引入 Promise 是为了解决著名的 回调地狱 问题,但它们引入了自己的复杂性和语法复杂性。它们是良好的原语,可以向开发人员公开更好的语法:那就是Async Functions (异步函数)。
一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
function doSomethingAsync() {
return new Promise((resolve) => {
setTimeout(() => resolve('I did something'), 3000)
})
}
async function doSomething() {
console.log(await doSomethingAsync())
}
console.log('Before')
doSomething()
console.log('After')
输出如下内容:
1
2
3
Before
After
I did something //after 3s
如果在promise中发生错误,在调用doSomething之后添加catch方法。
等多详细用法点击查看更多信息
共享内存 和 Atomics
WebWorkers 用于在浏览器中创建多线程程序。
他们通过事件提供消息传递协议。 从ES2017开始,您可以使用 SharedArrayBuffer 在 Web worker 及其创建者之间创建共享内存数组。
由于我们不知道向共享内存部分写入要花费多少时间来传播,因此 Atomics 是一种在读取值时执行该操作的方法,并且完成了任何类型的写入操作。
参考
ES2017(ES8)带来的重大新特性 – JavaScript 完全手册(2018版)
ES7和ES8新特性
ecma-262-8.0