#### async和await
> async和await兩種語法結合讓異步代碼像同步代碼一樣
* async函數
> async函數的返回值為promise對象
>
> promise對象的結果又async函數執行的返回值決定
* await表達式
> await 必須寫在async函數中
>
> await右側的表達式一般為promise對象
>
> await返回的是promise成功的值
>
> await的promise失敗了,就會拋出異常,需要通過 `tru ... catch` 捕獲異常
#### 對象方法 擴展
| Object.values | 返回一個給定對象的所有可枚舉屬性值的數組 |
| Object.entries | 返回一個給定對象自身可遍歷屬性 \[key,value\] 的數組 |
| Object.getOwnPropertyDescriptors | 返回指定對象所有自身屬性的描述對象 |
~~~
const school = { // 聲明對象 ?name:'qinghua', ?cities:['北京','上海','廣州','深圳'], ?xueke:['前端','python','nodejs','php']}console.log(Object.keys(school)) ? // 獲取所有的鍵 ? ["name", "cities", "xueke"]console.log(Object.values(school)) ?// 獲取有的值 ["qinghua", Array(4), Array(4)]console.log(Object.entries(school)) ?// [[key1,value1],[key2,value2]...],可用于生產Mapconsole.log(new Map(Object.entries(school)))console.log(new Map(Object.entries(school)).get('name')) // 'qinghua'console.log(Object.getOwnPropertyDescriptors(school)) // 返回對象屬性的 描述對象 ? 見下圖const obj = Object.create(null,{ ?// 第一個參數:原型對象,第二個參數:描述對象 ?value:'yishe', ? ? ? ? ?// getOwnPropertyDescriptors返回的就是描述對象 ?writable:true, ? ? ? ? ?// 是否可寫,(writable cofigurable enumerable)屬性特性 ?cofigurable:true, ? ? ? ? // 是否可以刪除,屬性特性克隆對象時也許會用到 ?enumerable:true ? ? ? ? ?// 是否可以枚舉})
~~~