ES8今天,我们来学习一下es8的一些新API。1、Async/Await语法的使用和promise有什么关系?2、Object.values()、Object.keys()、Object.entries(),这三者是什么关系?3.字符串填充?有哪些语法和使用场景?4.什么是Object.getOwnPropertyDescriptors()?描述符的使用场景有哪些?1.什么是Async/Await1和Async/Await?为什么会出现?和promise有什么关系?async和await是Promise的扩展,即在函数内部创建一个新的Promise对象实例。我们不需要手动声明一个Promise实例,因为js是单线程的,使用promise可以更方便我们异步的编写和操作,而async是让我们像同步操作一样写Promise。//首先回顾一下promise:1.首先在你的函数中实例化一个promise对象2.最后在调用中通过函数获取promise实例3.通过实例调用then方法进行异步处理asyncfunctionfn(){return128;}fn().then(val=>window.console.log(val))//128//这里其实可以得到128其实returnreturn是一个promise对象。虽然我们写128。这是因为内部将128包装到Promise.resolve(128)asyncfunctionfn(){returnPromise.resolve(128)}fn().then(val=>window.console.log(val))//1282。await的用法和注意事项如下。我们希望代码从上到下依次执行。这里我们其实是用await让他同步执行,这样我们才能得到想要的结果。asyncfunctionfn(){letpromise=newPromise((resolve,reject)=>{setTimeout(()=>resolve("hahahah!"),1000)})promise.then(val=>window.console.log(val))window.console.log(999)returnPromise.resolve(128)}fn().then(val=>window.console.log(val))//打印如下:999,128,"hahahah!”那如果我们想让他顺序执行呢?请看下面的代码,其实我们也知道这里的代码asyncfunctionfn(){letpromise=newPromise((resolve,reject)=>{setTimeout(()=>resolve("hahahah!"),1000)})让结果=等待承诺;window.console.log(result)window.console.log(999)returnPromise.resolve(128)}fn().then(val=>window.console.log(val))//"hahahah!",999,128,tips:1.如果async函数显式返回Promise以外的东西,会自动包装成Promise对象。2.await后面一定要有Promise对象。如果不是,它将自动包装到一个Promise对象中。3.awaitonly可以在标有async的函数内部使用,单独使用会触发Syntaxerror。2、Object.values()、Object.keys()、Object.entries(),这三者是什么关系?1.对象。价值观()?Object.values()方法返回给定对象本身的所有可枚举属性值的数组,顺序与使用for...in循环相同(区别在于for-in循环枚举属性在原型链)。//以前我们想要获取一个对象的key和value,我们经常使用forin,现在出现的Object.values()可以让我们直接获取对象的value;letobj={name:'miya',age:18,job:'FE'};Object.values(obj)//["miya",18,"FE"]2.不难看出set和map的数据格式使用values()。其实不管是用map还是set格式,都有Iterator(可迭代协议)。让s=newSet([1,2,3,4]);s.值();//SetIterator{1,2,3,4}letobj={name:'miya',age:18,job:'FE'};varmap=newMap(Object.entries(obj));map.values();//{"miya",18,"FE"}tips:Object.values可以找到对象上枚举属性的值,所以只要对象是可枚举的,而不只是{};3.Object.entries()Object.entries()返回一个数组,其元素直接在对象上找到一个对应可枚举属性键值对的数组。属性的顺序与通过手动循环遍历对象的属性值给出的顺序相同。接下来,我们使用forof来遍历这个对象;letobj={name:'miya',age:18,job:'FE'};for(let[k,v]ofobj){console.log(k,v)}//未捕获的类型错误:obj不是iterable结果是错误的。查看错误原因。这是因为obj没有可迭代的属性。这里我们需要使用Object.entries()来转换obj。letobj={name:'miya',age:18,job:'FE'};for(let[k,v]ofObject.entries(obj)){console.log(k,v)}//namemiya//18岁//工作FE3.字符串填充?es8中添加字符串填充的方法是String.prototype.padStart和String.prototype.padEnd;让我们接下来使用它。1.String.prototype.padStartpadStart()方法用另一个字符串填充当前字符串(必要时重复),使结果字符串达到给定的长度。从当前字符串的开头(左侧)应用填充。for(leti=1;i<20;i++){console.log(i.toString().padStart(2,0))}'12'.padStart(10,'YYYY-MM-DD')'2019-11-23'.padStart(10,'YYYY-MM-DD')//可见10不满足。2、String.prototype.padEnd方法会用一个字符串填充当前字符串(必要时重复填充),填充后返回一个达到指定长度的字符串。从当前字符串的末尾(右侧)开始填充。'abc'.padEnd(6,"123456");//3。什么是Object.getOwnPropertyDescriptors()?描述符的使用场景有哪些?该方法返回一个属性描述符,该描述符对应于指定对象上的自有属性。(自有属性是指直接赋给对象的属性,不需要从原型链中查找)1.比如我们想让Object中的某个属性和值不被枚举怎么办?es5和es6是怎么做到的?让obj={name:'miya',age:18,job:'FE'};Object.defineProperty(obj,'age',{enumerable:false})Object.keys(obj)//["name","job"]Object.values(obj)//["miya","FE"]Object.getOwnPropertyDescriptors(obj)2、Reflect,.getOwnPropertyDescriptor(obj,'age'),extension下,这个是在es6中Reflect,也可以看作是对象元素的描述符。接受2个参数(object.property);Reflect.getOwnPropertyDescriptor(obj,'age')//configurable:trueenumerable:falsevalue:18writable:truetips:这里可以看到age的property和value是看不到成功的。但我想看看如果他们的属性没有改变会怎样。这里我们可以使用Object.getOwnPropertyDescriptors()来查看obj中的所有属性。这里展开:defineProperty有三个属性(object,要操作的元素,描述符)这个描述符包括几个属性:*value[属性的值]*writable[属性的值是否可以改变]*enumerable[属性是否可以改变]值可枚举]*可配置[描述符本身是否可修改,属性是否可删除]
