zoukankan      html  css  js  c++  java
  • ES7,ES8新特性

    今天要来翻翻老梗了,有关于ES6的使用,在前端工程代码里面已经很普遍了,但是限于兼容性的限制,并没有过多的应用到具体实践中。ES7和ES8相关新特性的更新又让人忍不住去试试水。

    ES7新特性

    ES7在ES6的基础上添加了三项内容:求幂运算符(**)Array.prototype.includes()方法、函数作用域中严格模式的变更。

    求幂运算符(**)


    Math.pow()的简写

    2 ** 2 = 4与Math.pow(2,2) = 4的效果是等同的

    Array.prototype.includes()

    这个方法是检查一个数组中是否有某个元素

    ['a', 'b', 'c'].includes('a')     // true
    ['a', 'b', 'c'].includes('d')     // false

    当接收两个参数的时候,第二个参数是检测开始的下标,默认从零开始

    ['a', 'b', 'c', 'd'].includes('b', 1)      // true
    ['a', 'b', 'c', 'd'].includes('b', 2)      // false

    类比于indexOf,indexOf得出的是元素的位置(下标),如果元素不存在的时候则返回-1

    有一个特殊点:indexOf并不能识别NaN,返回了令人匪夷所思的结果

    还有一个特殊点:includes认为+0和-0是一样的

    ES8新特性

    异步函数(Async functions)

    为了避免回调函数多层嵌套的问题,异步函数的出现完美的解决了这个问题,从promise到async await,异步函数和异步回调的流程更加清晰和明了。

    var promise = new Promise((resolve, reject) => {
      this.login(resolve)
    })
    .then(() => this.getInfo())
    .catch(() => { console.log("Error") })

    resolve是成功之后的回调,reject失败之后的回调

    当有多个请求任务的时候promise会出现很多的then,如此看来,整个流程也不是很清晰。

    之后引入了另外一种异步编程机制:Generator 

    Generator函数的用法如下:

    function* helloWorldGenerator() {
      yield 'hello';
      yield 'world';
      return 'ending';
    }
    
    var hw = helloWorldGenerator();

    Generator的特点如下:1,函数声明的* 2内部的yield关键字。除此之外使用方法和普通函数一样。

    但是关键字yield相当于一种阻遏机制,需要手动触发,一下示例演示Generator的用法:

    因为yield是一种阻遏机制,分析一下用法:

    var gen = function* () {
      const f1 = yield this.login()
      const f2 = yield this.getInfo()
    };

    ES8引入了async函数,使得异步操作变得更加方便。简单说来,它就是Generator函数的语法糖。

    async function asyncFunc(params) {
      const result1 = await this.login()
      const result2 = await this.getInfo()
    }

    Object.entries()和Object.values()

    该方法会将某个对象的可枚举属性与值按照二维数组的方式返回。若目标对象是数组时,则会将数组的下标作为键值返回。如果对象的key值是数字,则返回值会对key值进行排序,返回的是排序后的结果。例如:

    Object.entries({ one: 1, two: 2 })    //[['one', 1], ['two', 2]]
    Object.entries([1, 2])                //[['0', 1], ['1', 2]]
    Object.entries({ 3: 'a', 4: 'b', 1: 'c' }) //[['1', 'c'], ['3', 'a'], ['4', 'b']]
    Object.values({ one: 1, two: 2 }) //[1, 2]
    Object.values({ 3: 'a', 4: 'b', 1: 'c' }) //['c', 'a', 'b']

    字符串填充:padStart和padEnd

    ES8提供了新的字符串方法-padStart和padEnd。padStart函数通过填充字符串的首部来保证字符串达到固定的长度,反之,padEnd是填充字符串的尾部来保证字符串的长度的。该方法提供了两个参数:字符串目标长度和填充字段,其中第二个参数可以不填,默认情况下使用空格填充。

    'Vue'.padStart(10)           //'       Vue'
    'Vue'.padStart(10, '_*')           //'_*_*_*_Vue'
    'JavaScript'.padStart(8, 'Hi')     //'JavaScript'
    'Vue'.padEnd(10, '_*')           //'Vue_*_*_*_'
    'JavaScript'.padEnd(8, 'Hi')     //'JavaScript'

    Object.getOwnPropertyDescriptors()

    该方法会返回目标对象中所有属性的属性描述符,该属性必须是对象自己定义的,不能是从原型链继承来的。先来看个它的基本用法:

    let obj = {
      id: 1,
      name: 'test',
      get gender() {
        console.log('gender')
      },
      set grade(g) {
        console.log(g)
      }
    }
    Object.getOwnPropertyDescriptors(obj)
    
    //输出结果为:
    {
      gender: {
        configurable: true,
        enumerable: true,
        get: f gender(),
        set: undefined
      },
      grade: {
        configurable: true,
        enumerable: true,
        get: undefined,
        set: f grade(g)
      },
      id: {
        configurable: true,
        enumerable: true,
        value: 1,
        writable: true
      },
      name: {
        configurable: true,
        enumerable: true,
        value: 'test',
        writable: true
      }
    }

    方法还提供了第二个参数,用来获取指定属性的属性描述符。

    let obj = {
      id: 1,
      name: 'test',
      get gender() {
        console.log('gender')
      },
      set grade(g) {
        console.log(g)
      }
    }
    Object.getOwnPropertyDescriptor(obj, 'id')
    
    //输出结果为:
    {
      id: {
        configurable: true,
        enumerable: true,
        value: 1,
        writable: true
      }
    }

    类比于Object.assign()

    assign方法只能拷贝一个属性的值,而不会拷贝它背后的复制方法和取值方法。Object.getOwnPropertyDescriptors()主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题Object.getOwnPropertyDescriptors方法配合Object.defineProperties方法,就可以实现正确拷贝。

    let obj = {
      id: 1,
      name: 'test',
      get gender() {
        console.log('gender')
      }
    }
    let obj1 = {}
    Object.defineProperties(obj1, Object.getOwnPropertyDescriptors(obj))
    Object.getOwnPropertyDescriptors(obj1)
    
    //输出结果为:
    {
      gender: {
        configurable: true,
        enumerable: true,
        get: f gender(),
        set: undefined
      },
      id: {
        configurable: true,
        enumerable: true,
        value: 1,
        writable: true
      },
      name: {
        configurable: true,
        enumerable: true,
        value: 'test',
        writable: true
      }
    }

    以上的是部分ES7,ES8新特性,积极学习ES的新特性,这些新特性用起来能极大地方便和精简自己的编码逻辑。

  • 相关阅读:
    正则表达式速查表
    Python第三方库管理Anaconda
    Python3.x和Python2.x的区别
    python 学习 “笨办法学python”(随书补充)
    python 中文输入的注意事项
    mongodb update 字符 操作(补充)
    mongodb update 字符 操作
    04.视频播放器通用架构实践
    05.视频播放器内核切换封装
    03.视频播放器Api说明
  • 原文地址:https://www.cnblogs.com/wyliunan/p/10616263.html
Copyright © 2011-2022 走看看