做为一个前端开发者,感受须要学习的东西贼多,ES6刚学会用没多久,又得学习了解ES7/ES8新增的东西,这里是看了大佬们文章的一点点总结以及摘抄的内容,给本身当笔记使用html
内容转载自:https://www.cnblogs.com/zhuanzhuanfe/p/7493433.html#undefined前端
https://www.cnblogs.com/leungUwah/p/7932912.html // async和await的用法数组
ES7新增内容有:Array.prototype.includes()、求幂运算符 (**)、前端异步async()/await()等等异步
1、Array.prototype.includes()async
Array.prototype.includes()即在数组中查找某个元素是否存在,返回值为Boolean,存在返回true,反之为false,以下:函数
let ary = ['a', 'b', 'c', 1, 2, 3]; ary.prototype.includes(2); // true ary.prototype.includes('f'); // false
其实Array.prototype.includes()的参数有两个,第一个参数为咱们要查找的目标元素,第二个参数则是开始查询的数组索引值(默认为0),若是传入第二个参数,则今后下标值开始查询目标元素。以下:学习
let ary = ['a', 'b', 'c', 1, 2, 3];
ary.prototype.includes('b'); // true,从下标0开始日后进行查找 ary.prototype.includes(2, 2); // true ary.prototype.includes('b', 2); // false
Array.prototype.includes()跟JavaScript的indexOf()比较类似,可是他们之间也是有些许区别spa
共同点:(1)好比都是经过索引值逐个去查询目标元素;(2)都是使用全等符(===)进行判断prototype
不一样点:(1)indexOf()返回的是目标元素在数组中的位置(若是找不到则返回 -1),Array.prototype.includes()则是判断目标元素在该数组中是否存在;code
(2)Array.prototype.includes()能够对NaN进行判断,由于在Array.prototype.includes()中,它认为NaN === NaN是成立的,故返回值为true;可是在indexOf()中,NaN !== NaN,因此若是使用indexOf()寻找数组中的值为NaN元素没法找到,返回值为-1
适用场景:(1)若是只是判断目标元素是否存在于数组中,则优先使用Array.prototype.includes();若是须要知道目标元素在数组中的位置,则使用indexOf()
(2)若是须要判断数组中值为NaN的元素,只能使用Array.prototype.includes();
2、幂运算符(**)
JavaScript中,幂运算通常都是使用Math.pow(m, n),表示m的n次方,以下:
Math.pow(3, 2); // 即3的2次方等于9
在ES7中,可使用幂运算符**进行幂运算,以下:
let a = 3; a **== 2 // 9,即 a = a**2, 此时a等于3的2次方,即为9了
3、前端异步async()/await()
async顾名思义是“异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是“等待”的意思,就是用于等待异步完成。而且await只能在async函数中使用
一般async、await都是跟随Promise一块儿使用的。为何这么说呢?由于async返回的都是一个Promise对象同时async适用于任何类型的函数上。这样await获得的就是一个Promise对象(若是不是Promise对象的话那async返回的是什么 就是什么);
await获得Promise对象以后就等待Promise接下来的resolve或者reject。
来看一段简单的代码:
async function testSync() { const response = await new Promise(resolve => { setTimeout(() => { resolve("async await test..."); }, 1000); }); console.log(response); } testSync();//async await test...
就这样一个简单的async、await异步就完成了。使用async、await完成异步操做代码可读与写法上更像是同步的,也更容易让人理解。
串行:即等待前一个await执行完成后执行另外一个await,
借用大佬的代码:
async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); }) } const serialFn = async () => { //串行执行 console.time('serialFn') console.log(await asyncAwaitFn('string 1')); console.log(await asyncAwaitFn('string 2')); console.timeEnd('serialFn') } serialFn();
这里能够看到串行执行完毕耗时2秒多了。
并行:即先执行多个async方法,而后再运行await操做,代码以下:
async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); }) } const parallel = async () => { //并行执行 console.time('parallel') const parallelOne = asyncAwaitFn('string 1'); const parallelTwo = asyncAwaitFn('string 2') //直接打印 console.log(await parallelOne) console.log(await parallelTwo) console.timeEnd('parallel') } parallel()
能够看到并行执行结束总共耗时1秒多,比串行快了不少
JavaScript异步请求确定会有请求失败的状况,上面也说到了async返回的是一个Promise对象。既然是返回一个Promise对象的话那处理当异步请求发生错误的时候咱们就要处理reject的状态了。
在Promise中当请求reject的时候咱们可使用catch。为了保持代码的健壮性使用async、await的时候咱们使用try catch来处理错误。
async function catchErr() { try { const errRes = await new Promise((resolve, reject) => { setTimeout(() => { reject("http error..."); }, 1000); ); //日常咱们也能够在await请求成功后经过判断当前status是否是200来判断请求是否成功 // console.log(errRes.status, errRes.statusText); } catch(err) { console.log(err); } } catchErr(); //http error...
其实使用async、await的主要目的是为了使原始Promise的then处理的整个异步请求代码变得更加简洁清爽。