es6 宏观异步和微观异步
让我们看一下ES2017随附的最重要JavaScript更新,还简要介绍了此更新过程的实际发生方式。
JavaScript(ECMAScript)是一个不断发展的标准,由许多供应商在多个平台上实施。 ES6(ECMAScript 2015)是一个大型版本,历时六年才定稿。 制定了新的年度发布流程以简化流程并快速添加新功能。
谦虚命名的39号技术委员会(TC39)由包括浏览器供应商在内的各方组成,他们聚在一起以严格的进度推进JavaScript提案:
阶段0:稻草人–
有关新的或改进的ECMAScript功能的想法的初步提交。
阶段1:提案–
由TC39的至少一名成员拥护的正式提案文件,其中包括API示例,语言语义,算法,潜在障碍,填充和演示。
阶段2:草稿–
功能说明的初始版本。 尽管可以在Babel之类的编译器中使用该功能,但仍需要对该功能进行两种实验性的实现。
第三阶段:候选人
审核投标规范,并从供应商处收集反馈。
阶段4:完成–
该提案已准备好包含在ECMAScript中。 功能到此阶段时,才应视为标准。 但是,在Node.js之类的浏览器和运行时中可能要花更长的时间。
如果ES2015太大,则ES2016故意很小,无法证明标准化过程。 添加了两个新功能:
.includes()
方法,当数组中包含值时返回true或false;以及 a ** b
取幂运算符,与Math.pow(a, b)
。 ES2017(或旧版ES8)的功能集被认为是对ECMAScript规范的第一个适当的修订。 它提供以下商品...
与大多数语言不同,JavaScript默认情况下是异步的。 可能花费任何时间的命令不会停止执行。 这包括诸如请求URL,读取文件或更新数据库之类的操作。 必须传递一个回调函数,该回调函数将在该操作的结果已知时执行。
当必须按顺序执行一系列嵌套的异步函数时,这可能导致回调地狱。 例如:
function doSomething() {
doSomething1((response1) => {
doSomething2(response1, (response2) => {
doSomething3(response2, (response3) => {
// etc...
};
});
});
}
ES2015(ES6)引入了Promises,它提供了一种更干净的方式来表达相同的功能。 承诺了您的函数后,可以使用以下命令执行它们:
function doSomething() {
doSomething1()
.then(doSomething2)
.then(doSomething3)
}
ES2017异步函数在Promises上扩展,使异步调用更加清晰:
async function doSomething() {
const
response1 = await doSomething1(),
response2 = await doSomething2(response1),
response3 = await doSomething3(response2);
}
await
有效地使每个调用看起来像是同步的,而不会占用JavaScript的单个处理线程。
所有现代浏览器(不支持IE或Opera Mini)和Node.js 7.6+均支持异步功能。 它们将改变您编写JavaScript的方式,并且整篇文章都将专门讨论回调,Promises和Async函数。 幸运的是,我们有一个! 请参阅现代JavaScript中的流控制 。
Object.values()
是一种从对象内的名称-值对中提取值数组的快速且更具声明性的方法。 例如:
const myObject = {
a: 1,
b: 'Two',
c: [3,3,3]
}
const values = Object.values(myObject);
// [ 1, 'Two', [3,3,3] ]
您无需再for … of
循环编写for … of
! 所有现代浏览器(不是IE或Opera Mini)和Node.js 7.0+都原生支持Object.values
。
Object.entries()
从包含名称-值对的对象返回一个数组。 返回的数组中的每个值都是一个包含名称(索引0)和值(索引1)的子数组。 例如:
const myObject = {
a: 1,
b: 'Two',
c: [3,3,3]
}
const entries = Object.entries(myObject);
/*
[
[ 'a', 1 ],
[ 'b', 'Two' ],
[ 'c', [3,3,3] ]
]
*/
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
这提供了另一种遍历对象属性的方式。 它也可以用来定义一个Map :
const map = new Map(Object.entries({
a: 1,
b: 2,
c: 3
}));
大多数现代浏览器(但不支持IE,Opera Mini和iOS Safari)和Node.js 7.0+都原生支持Object.values
。
Object.getOwnPropertyDescriptors()
方法返回另一个包含所有属性描述符( .value
, .writable
, .get
, .set
, .configurable
和.enumerable
)的对象。
这些属性直接存在于对象上,而不存在于对象的原型链中。 它类似于Object.getOwnPropertyDescriptor(object,property) -除了返回所有属性,而不仅仅是返回一个。 例如:
const myObject = {
prop1: 'hello',
prop2: 'world'
};
const descriptors = Object.getOwnPropertyDescriptors(myObject);
console.log(descriptors.prop1.writable); // true
console.log(descriptors.prop2.value); // 'world'
字符串填充在JavaScript中一直引起争议。 流行的左撇子库在引起代表同名即时消息传递应用程序的律师的注意之后被从npm中撤出。 不幸的是,它已被用作成千上万个项目的依赖项,并且互联网中断了。 npm随后更改了操作程序,并且左键盘未发布。
ES2017中已添加本机字符串填充,因此无需使用第三方模块。 .padStart()
和.padEnd()
将字符添加到字符串的开头或结尾,直到它们达到所需的长度。 两者都接受最小长度和可选的'fill'
字符串(默认为空格)作为参数。 例子:
'abc'.padStart(5); // ' abc'
'abc'.padStart(5,'-'); // '--abc'
'abc'.padStart(10, '123'); // '1231231abc'
'abc'.padStart(1); // 'abc'
'abc'.padEnd(5); // 'abc '
'abc'.padEnd(5,'-'); // 'abc--'
'abc'.padEnd(10, '123'); // 'abc1231231'
'abc'.padEnd(1); // 'abc'
所有现代浏览器(非IE)和Node.js 8.0+都支持.padStart()
和.padEnd()
。
ES2017的一个小更新:逗号后不再在对象定义,数组声明,函数参数列表等中引发语法错误:
// ES2017 is happy!
const a = [1, 2, 3,];
const b = {
a: 1,
b: 2,
c: 3,
};
function c(one,two,three,) {};
在所有浏览器和Node.js中均启用尾随逗号。 但是,撰写本文时,仅Chrome 58+和Firefox 52+中支持函数参数中的尾部逗号。
SharedArrayBuffer对象用于表示可在Web Worker之间共享的固定长度的原始二进制数据缓冲区。 Atomics对象提供了一种从SharedArrayBuffer
定义的内存位置进行读写的可预测方法。
虽然两个对象均在Chrome和Firefox中实现,但由于Spectre漏洞于2018年1月被禁用。
完整的ECMAScript 2017语言规范可在ECMA International网站上获得 。 您是否渴望更多? ES2018的新功能已经发布!
翻译自: https://www.sitepoint.com/es2017-whats-new/
es6 宏观异步和微观异步