美文网首页
ES2019 新特性

ES2019 新特性

作者: HalShaw | 来源:发表于2019-08-19 22:06 被阅读0次
    ES2019

    Object.fromEntries

    在ES2017中,引入了Object.entries来把Object转成数组,如下:

    let students = {
      amelia: 20,
      beatrice: 22,
      cece: 20,
      deirdre: 19,
      eloise: 21
    }
    
    Object.entries(students) 
    // [
    //  [ 'amelia', 20 ],
    //  [ 'beatrice', 22 ],
    //  [ 'cece', 20 ],
    //  [ 'deirdre', 19 ],
    //  [ 'eloise', 21 ]
    // ]
    

    引入Object.entries这个方法的目的是为了使Object也可以使用数组的mapfilterreduce等原生方法,但是使用完之后必须要自己手动还原回去,例如:

    let students = {
      amelia: 20,
      beatrice: 22,
      cece: 20,
      deirdre: 19,
      eloise: 21
    }
    
    // convert to array in order to make use of .filter() function
    let overTwentyOne = Object.entries(students).filter(([name, age]) => {
      return age >= 21
    }) // [ [ 'beatrice', 22 ], [ 'eloise', 21 ] ]
    
    // turn multidimensional array back into an object
    let DrinkingAgeStudents = {}
    for (let [name, age] of overTwentyOne) {
        DrinkingAgeStudents[name] = age;
    }
    // { beatrice: 22, eloise: 21 }
    

    上述代码使用了Object.entries及数组的filter方法过滤了年龄大于等于21的成员,然后又使用了for...of把数字转变回了Object
    Object.fromEntries就是用来替代上面代码中的for...of循环的,使得Object调用数组的原生方法更简洁方便,代码如下:

    let students = {
      amelia: 20,
      beatrice: 22,
      cece: 20,
      deirdre: 19,
      eloise: 21
    }
    
    // convert to array in order to make use of .filter() function
    let overTwentyOne = Object.entries(students).filter(([name, age]) => {
      return age >= 21
    }) // [ [ 'beatrice', 22 ], [ 'eloise', 21 ] ]
    
    // turn multidimensional array back into an object
    let DrinkingAgeStudents = Object.fromEntries(overTwentyOne); 
    // { beatrice: 22, eloise: 21 }
    

    需要注意的一点是,使用Object.fromEntries会把Object中的重复key覆盖掉,只保存最后一个,如下:

    let students = [
      [ 'amelia', 22 ], 
      [ 'beatrice', 22 ], 
      [ 'eloise', 21], 
      [ 'beatrice', 20 ]
    ]
    
    let studentObj = Object.fromEntries(students); 
    // { amelia: 22, beatrice: 20, eloise: 21 }
    // dropped first beatrice!
    

    Array.prototype.flat

    通常,数组会出现二维或者以上的情况,这个时候如果我们需要降维的话,常用的一种方法时使用concat方法,如下:

    let courses = [
      {
        subject: "math",
        numberOfStudents: 3,
        waitlistStudents: 2,
        students: ['Janet', 'Martha', 'Bob', ['Phil', 'Candace']]
      },
      {
        subject: "english",
        numberOfStudents: 2,
        students: ['Wilson', 'Taylor']
      },
      {
        subject: "history",
        numberOfStudents: 4,
        students: ['Edith', 'Jacob', 'Peter', 'Betty']
      }
    ]
    
    let courseStudents = courses.map(course => course.students)
    // [
    //   [ 'Janet', 'Martha', 'Bob', [ 'Phil', 'Candace' ] ],
    //   [ 'Wilson', 'Taylor' ],
    //   [ 'Edith', 'Jacob', 'Peter', 'Betty' ]
    // ]
    
    [].concat.apply([], courseStudents) // we're stuck doing something like this
    

    但是在ES2019中引入了Array.prototype.flat,其接受一个可选参数表示需要展开的深度,默认值为1,可以帮助我们快速实现数组降维,如下:

    let courseStudents = [
      [ 'Janet', 'Martha', 'Bob', [ 'Phil', 'Candace' ] ],
      [ 'Wilson', 'Taylor' ],
      [ 'Edith', 'Jacob', 'Peter', 'Betty' ]
    ]
    
    let flattenOneLevel = courseStudents.flat(1)
    console.log(flattenOneLevel)
    // [
    //   'Janet',
    //   'Martha',
    //   'Bob',
    //   [ 'Phil', 'Candace' ],
    //   'Wilson',
    //   'Taylor',
    //   'Edith',
    //   'Jacob',
    //   'Peter',
    //   'Betty'
    // ]
    
    let flattenTwoLevels = courseStudents.flat(2)
    console.log(flattenTwoLevels)
    // [
    //   'Janet',   'Martha',
    //   'Bob',     'Phil',
    //   'Candace', 'Wilson',
    //   'Taylor',  'Edith',
    //   'Jacob',   'Peter',
    //   'Betty'
    // ]
    

    不指定参数与参数值等于1的时候一样:

    let courseStudents = [
      [ 'Janet', 'Martha', 'Bob', [ 'Phil', 'Candace' ] ],
      [ 'Wilson', 'Taylor' ],
      [ 'Edith', 'Jacob', 'Peter', 'Betty' ]
    ]
    
    let defaultFlattened = courseStudents.flat()
    console.log(defaultFlattened)
    // [
    //   'Janet',
    //   'Martha',
    //   'Bob',
    //   [ 'Phil', 'Candace' ],
    //   'Wilson',
    //   'Taylor',
    //   'Edith',
    //   'Jacob',
    //   'Peter',
    //   'Betty'
    // ]
    
    • 贪心操作Infinity
      对于未知深度的数组,可以使用Infinity参数来实现完全降维:
    let courseStudents = [
      [ 'Janet', 'Martha', 'Bob', [ 'Phil', 'Candace' ] ],
      [ 'Wilson', 'Taylor' ],
      [ 'Edith', 'Jacob', 'Peter', 'Betty' ]
    ]
    
    let alwaysFlattened = courseStudents.flat(Infinity)
    console.log(alwaysFlattened)
    // [
    //   'Janet',   'Martha',
    //   'Bob',     'Phil',
    //   'Candace', 'Wilson',
    //   'Taylor',  'Edith',
    //   'Jacob',   'Peter',
    //   'Betty'
    // ]
    

    事实上,Infinity参数在实际情况中应该谨慎使用,而且在真正未知数组维数时并不推荐使用Infinity参数。

    Array.prototype.flatMap

    flatMap 等价于mapflat不加参数的结合体,所以flatMap 只展开一层数组。

    • 普通半版数组中插入值:
    let grades = [78, 62, 80, 64]
    
    let curved = grades.map(grade => [grade, grade + 7])
    // [ [ 78, 85 ], [ 62, 69 ], [ 80, 87 ], [ 64, 71 ] ]
    
    let flatMapped = [].concat.apply([], curved) // now flatten, could use flat but that didn't exist before either
    // [
    //  78, 85, 62, 69,
    //  80, 87, 64, 71
    // ]
    
    • Array.prototype.flat
    let grades = [78, 62, 80, 64]
    
    let flatMapped = grades.map(grade => [grade, grade + 7]).flat()
    // [
    //  78, 85, 62, 69,
    //  80, 87, 64, 71
    // ]
    
    • flatMap进阶版
    let grades = [78, 62, 80, 64]
    
    let flatMapped = grades.flatMap(grade => [grade, grade + 7]);
    // [
    //  78, 85, 62, 69,
    //  80, 87, 64, 71
    // ]
    

    由于是mapflat不加参数的结合体,flatMap 只展开一层数组:

    let grades = [78, 62, 80, 64]
    
    let flatMapped = grades.flatMap(grade => [grade, [grade + 7]]);
    // [
    //   78, [ 85 ],
    //   62, [ 69 ],
    //   80, [ 87 ],
    //   64, [ 71 ]
    // ]
    

    String.trimStart 和 String.trimEnd

    等价于之前的String.trimRightString.trimLeft

    let message = "   Welcome to CS 101    "
    message.trimRight()
    // '   Welcome to CS 101'
    message.trimLeft()
    // 'Welcome to CS 101   '
    message.trimRight().trimLeft()
    // 'Welcome to CS 101'
    

    等价于

    let message = "   Welcome to CS 101    "
    message.trimEnd()
    // '   Welcome to CS 101'
    message.trimStart()
    // 'Welcome to CS 101   '
    message.trimEnd().trimStart()
    // 'Welcome to CS 101'
    

    可选的catch绑定

    在之前的版本中,try...catch中的catch后面必须要跟一个参数,即使catch块里面什么内容都没有,所以在ES2019中,catch块后面的参数是可选的,如下:

    try {
      let parsed = JSON.parse(obj)
    } catch(e) {
      // ignore e, or use
      console.log(obj)
    }
    

    e可以不写:

    try {
      let parsed = JSON.parse(obj)
    } catch {
      console.log(obj)
    }
    

    Function.toString() 更新

    之前的版本中,Function.toString()直接把空格去掉了:

    function greeting() {
      const name = 'CSS Tricks'
      console.log(`hello from ${name}`)
    }
    
    greeting.toString()
    //'function greeting() {\nconst name = \'CSS Tricks\'\nconsole.log(`hello from ${name} //`)\n}'
    

    但是,在ES2019中,会完全保留源码格式打印:

    function greeting() {
      const name = 'CSS Tricks'
      console.log(`hello from ${name}`)
    }
    
    greeting.toString()
    // 'function greeting() {\n' +
    //  "  const name = 'CSS Tricks'\n" +
    //  '  console.log(`hello from ${name}`)\n' +
    //  '}'
    

    参考

    https://css-tricks.com/all-the-new-es2019-tips-and-tricks/

    相关文章

      网友评论

          本文标题:ES2019 新特性

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