美文网首页js
Es6,7,8,9,10 新特性

Es6,7,8,9,10 新特性

作者: Luoyilin | 来源:发表于2019-12-13 11:14 被阅读0次
    1.0 Es7

    01). Array.prototype.includes() : 一个数组中是否含有某个值 ; 返回值 true/false

    console.log( ['1','2','3'].includes('1') ) //-----> true
    console.log( ['1','2','3'].includes(1) ) //-----> false
    

    注 : es6中 String.prototype.includes() : 一段字符串中是否含有某个字符串 ; 返回值是true/false

    let str = 'qianduan'
    console.log(str.includes('q') //---->true
    

    02). 求幂运算

       let num = 10
       console.log(num**2) // --->10000  10的二次幂
       console.log(Math.pow(num,2)) //--->10000
    
    2.0 Es8

    01). Async / Await : 比Promise 更优雅的异步

     // -Promise
      async function foo(){
          return Promise.reslove('浪里行舟')
      }
      foo().then(val=>{
      console.log(val) // ----> 浪里行舟
      })
     // -async
     function foo(){
      return "我爱前端"
     }
     foo().then(val=>{
        console.log(val) // ----> 我爱前端
     })
    

    02). Object.values() : 返回一个数组 数组中的项 是对象中的值 ;
    Object.entries( ) : 返回是一个数组 数组里面的每一项是一个数组集合 数组集合中的每一项分别是对象中的键值对 ;
    Object.fromEntries() : 将Object.entries() 对象转化为数组之后在转化为对象{}->[]->{}
    Object.keys()

    const obj ={
      'a' : 1,
      'b' : 2,
      'c' :3
     }
    console.log(Object.values(obj)) // [1,2,3]
    console.log(Object.entries(obj) // [['a',1],['b',2],['c',3]]
    let arr = Object.entries(obj) ;
    console.log(Object.fromEntries(arr)) //----> {'a' : 1,'b' : 2,'c' : 3}
     /**
        for ... in : 遍历对象 返回值 是对象中属性的值 ;
        for ... of : 遍历数组 返回值 是数组中的每一项 ;
          若用 for...of 遍历对象 要配合Object.keys() 使用 
      */
    for(const item of Object.keys(obj)){
      console.log(`${item}:${obj[item]}` // ---> 'a' : 1 ,'b' :2 ,'c':3
     }
    

    03). String Padding
    String.prototype.padStart() 和 String.prototype.padEnd() : 允许将空的字符串或其他字符串添加到原始字符串的结尾或者开头
    参数 : String.padStart(targetLength,'padingStr') :targetLength : 当前字符串的目标长度 , 如果新添加的字符串的长度小于目标长度 则返回字符串本身 ; 如果添加字符串的长度大于目标长度 ,则返回目标长度 多余的部分将会被截断 ;padingStr : 填充字符串

     // 结尾添加  String.padStart() 
     '12'.padStart('10','YYYY-MM-DD') // ---> 'YYYY-MM-12'
     // 开头添加  String.padEnd() 
     'A'.padEnd('5','aaaaa') // -----> 'Aaaaa'
    

    04). Object.getOwnPropertyDescriptors() : 返回指定对象的自身属性(非继承)的描述对象 ;

     let obj = {
        name : 'H5',
        get bar(){
          return 'abc'
        }
     }
    console.log(Object.getOwnPropertyDescriptors(obj))
    

    控制台 log 结果 如下 :


    Object.getOwnPropertyDesxriptors()方法 .png

    该方法的引入 主要解决Object.assgin() 无法正确拷贝set属性 和 get 属性的问题

    let obj = {
      name : '前端',
     set fn(value) {
      console.log(value)
      }
     get(){
      return '我爱前端'
      }
     }
    let target = { },
    Object.assgin(target,obj)
    console.log(getOwnPropertyDescriptor(target,'fn')
    
    Object.getOwnpropertyDescriptor().png
    obj对象的fn属性的值是一个赋值函数,Object.assign方法将这个属性拷贝给target对象,结果该属性的值变成了undefined。这是因为Object.assign方法总是拷贝一个属性的值,而不会拷贝它背后的赋值方法或取值方法
    Es5 中 Object.getOwnpropertyDescriptor() : 返回某个对象属性的描述对象 ;这个问题 Es8中 Object.getOwnpropertyDescriptors() 可以解决 代码如下 :
    let obj = {
      name : '前端',
     set fn(value) {
      console.log(value)
      },
     get(){
      return '我爱前端'
      }
     }
    let target = { },
    Object.assgin(target,Object.getOwnpropertyDescriptors(obj))
    console.log(getOwnPropertyDescriptor(target,'fn')
    
    Object.assgin()利用Object.getOwnpropertyDescriptors()实现拷贝.png
    3.0 Es9

    01). for await of

    // for....of 
    function Gen (time){
           return new Promise((reslove,reject)=>{
                setTimeout(()=>{
                    reslove(time)
                 },time)
             })
          }
     async function test(){
              let arr =[Gen(2000),Gen(300),Gen(1000)]
              for(let item of arr){
                    console.log(Date.now(),item.then(console.log))
              }
            }
      test()
    
    image.png
    由此可见: for of方法不能遍历异步迭代器
    //  for await of 
     function Gen (time){
           return new Promise((reslove,reject)=>{
                setTimeout(()=>{
                    reslove(time)
                 },time)
             })
          }
     async function test(){
              let arr =[Gen(2000),Gen(300),Gen(1000)]
              for await (let item of arr){
                    console.log(Date.now(),item)
              }
            }
      test()
    
    image.png

    由结果可见 :for await of遍历时,会等待前一个Promise对象的状态改变后,再遍历到下一个成员
    02). 数组的拆解

    // 1.0 复制
    let arr = ['我','爱','前端']
    let copy = [...arr]
    console.log(copy) // -----> '我爱前端'
    // 2.0 合并
    let arr1 = ['我']
    let arr2 = ['爱','前端']
    let arr3 = [...arr1,arr2]
    console.log(arr3) // ----> 我爱前端
    // 3.0 拆解
    let arr4 = [23,4,555,0]
    let arr5 = Math.max(...arr4)
    console.log(arr5) //---->5555
    

    ES9通过向对象文本添加扩展属性进一步扩展了这种语法。他可以将一个对象的属性拷贝到另一个对象上,参考以下情形:

     let input = {
          'a':1,
          'b':2,
          'c':3
      }
    let  output = {
         ...input ,
         'c':33
    }
    console.log(output) // -----> {'a':1,'b':2,'c':33}
    //---> 由此可见 : 如果存在相同的属性名,只有最后一个会生效;
    input.a= 'lyl'
    console.log(input,output) // --> {'a':'lyl'},{'a':1,'b':2,'c':33}  
    // 修改input对象中的值,output并没有改变,说明扩展运算符拷贝一个对象(类似这样obj2 = {...obj1}),实现只是一个对象的浅拷贝 
    

    属性的值是一个对象的话,该对象的引用会被拷贝 如下:

     let obj = {'x':{'y':'前端'}}
     let copy1 = {...obj} ;
     let copy2 = {...obj} ;
     obj.x.y ="lyl"
     console.log(copy1,copy2) // ---->{'x':{'y':'lyl}} ; 
     console.log(copy1.x === copy2.x) // --->true
    

    03).对象的拆解 :

    let obj = {
      'a':1,
      'b':2,
      'c':3
     }
    let {a,...test} = obj 
    console.log(a,test) // ----> 1,{'b':2, 'c':3}
    //注意 : ... 始终出现在对象的末尾 ;
    

    Promise.prototype.finally() :方法返回一个Promise,在promise执行结束时,无论结果是fulfilled或者是rejected,在执行then()和catch()后,都会执行finally指定的回调函数。

    4.0 Es10

    1.0 Array.prototype.flat() :默认deepth 是 1并将所有元素与遍历到的子数组中的元素合并为一个 新数组 返回
    2.0 Array.prototype.flatMap() :默认deepth 是 1;

    let arr = [1,2,3] ;
    let newArr1 = arr.map(item=>item*2).flat() 
    let newArr2 = arr.flatMap(item=>item*2)
    console.log(newArr1) // -->[2,4,6]
    console.log(newArr2) // -->[2,4,6]
    

    3.0.String.trimStart 和 String.trimEnd :方法从字符串的开头/结尾删除空格
    还有一些关于正则的知识 不太想整理了 原文章地址奉上https://mp.weixin.qq.com/s/8bov6788ivV0sHzmwrn5lw

    相关文章

      网友评论

        本文标题:Es6,7,8,9,10 新特性

        本文链接:https://www.haomeiwen.com/subject/edffnctx.html