#### 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 // 是否可以枚举})
~~~