作為一個前端開發者,感覺需要學習的東西賊多,ES6剛學會用沒多久,又得學習了解ES7/ES8新增的東西,這里是看了大佬們文章的一點點總結以及摘抄的內容,給自己當筆記使用
內容轉載自: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()等等
一、Array.prototype.includes()
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()比較相似,但是他們之間也是有些許區別
共同點:(1)比如都是通過索引值逐個去查詢目標元素;(2)都是使用全等符(===)進行判斷
不同點:(1)indexOf()返回的是目標元素在數組中的位置(如果找不到則返回 -1),Array.prototype.includes()則是判斷目標元素在該數組中是否存在;
(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();
二、冪運算符(**)
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了
三、前端異步async()/await()
什么是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完成異步操作代碼可讀與寫法上更像是同步的,也更容易讓人理解。
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秒多,比串行快了很多
async、await的錯誤處理
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處理的整個異步請求代碼變得更加簡潔清爽。
