最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ES6新特性

    正文概述 掘金(用户5085725637854)   2020-12-09   406

    1、块级作用域  关键字let,常量const

    2、对象字面量的属性赋值简写

    var obj={
        changeEvent(){
        }
    }
    

    3、赋值解构

    let singer = { first: "Bob", last: "Dylan" };
    let { first: f, last: l } = singer; // 相当于 f = "Bob", l = "Dylan"
    let [all, year, month, day] =  /^(\d\d\d\d)-(\d\d)-(\d\d)$/.exec("2015-10-25");
    let [x, y] = [1, 2, 3]; // x = 1, y = 2
    

    4、函数参数--默认值  参数打包  数组展开

    //Default
    function findArtist(name='lu', age='26') {
        ...
    }
    
    //Rest
    function f(x, ...y) {
      // y is an Array
      return x * y.length;
    }
    f(3, "hello", true) == 6
    
    //Spread
    function f(x, y, z) {
      return x + y + z;
    }
    // Pass each elem of array as argument
    f(...[1,2,3]) == 6
    

    5、箭头函数 Arrow functions

    1)简化了代码形式,默认return表达式结果

    2)自动绑定语义this。

    6、字符串模板

    var name = "Bob", time = "today";
    `Hello ${name}, how are you ${time}?`
    // return "Hello Bob, how are you today?"
    

    7、Iterators  迭代器   for+of

    迭代器有个next方法,调用会返回:

    1)返回迭代对象的一个元素

    2)如果已到迭代对象的末端

    const array = ['a', 'b', 'c', 'd', 'e'];
    const iterator = array[Symbol.iterator]();
    const first = iterator.next().value
    iterator.next().value // Since it was skipped, so it's not assigned
    const third = iterator.next().value
    iterator.next().value // Since it was skipped, so it's not assigned
    const last = iterator.next().value
    
    for (var n of ['a','b','c']) {
      console.log(n);
    }
    

    8、生成器  Generators

    9、class

    Class,有constructor、extends、super,但本质上是语法糖

    class Artist {
        constructor(name) {
            this.name = name;
        }
    
        perform() {
            return this.name + " performs ";
        }
    }
    
    class Singer extends Artist {
    
        constructor(name, song) {
            super.constructor(name);
            this.song = song;
        }
    
        perform() {
            return super.perform() + "[" + this.song + "]";
        }
    }
    
    let james = new Singer("Etta James", "At last");
    james instanceof Artist; // true
    james instanceof Singer; // true
    
    james.perform(); // "Etta James performs [At last]"
    

    10、Modules

    ES6中的内置模块功能借鉴了CommonJS和AMD的各自有点

    1)具有CommonJS的精简语法,唯一导出出口 single exports和循环依赖 cyclic dependencies的特点

    2)类似AMD,支持异步加载和可配置的模块加载

    // lib/math.js
    export function sum(x, y) {
      return x + y;
    }
    export var pi = 3.141593;
    
    // app.js
    import * as math from "lib/math";
    alert("2π = " + math.sum(math.pi, math.pi));
    
    // otherApp.js
    import {sum, pi} from "lib/math";
    alert("2π = " + sum(pi, pi));
    
    Module Loaders:
    // Dynamic loading – ‘System’ is default loader
    System.import('lib/math').then(function(m) {
      alert("2π = " + m.sum(m.pi, m.pi));
    });
    
    // Directly manipulate module cache
    System.get('jquery');
    System.set('jquery', Module({$: $})); // WARNING: not yet finalized
    

    11、weakmap

    weakmap对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。new WeakMap([iterable])  Iterable是一个数组  二元数组或者可遍历的且其元素是键值对的对象。每个键值对都会被加到新的WeakMap里。null会被当做undefined

    var wm1 = new WeakMap(),
        wm2 = new WeakMap(),
        wm3 = new WeakMap();
    var o1 = {},
        o2 = function() {},
        o3 = window;
    
    wm1.set(o1, 37);
    wm1.set(o2, 'azerty');
    wm2.set(o1, o2); // a value can be anything, including an object or a function
    wm2.set(o3, undefined);
    wm2.set(wm1, wm2); // keys and values can be any objects. Even WeakMaps!
    
    wm1.get(o2); // "azerty"
    wm2.get(o2); // undefined, because there is no key for o2 on wm2
    wm2.get(o3); // undefined, because that is the set value
    
    wm1.has(o2); // true
    wm2.has(o2); // false
    wm2.has(o3); // true (even if the value itself is 'undefined')
    
    wm3.set(o1, 37);
    wm3.get(o1); // 37
    
    wm1.has(o1); // true
    wm1.delete(o1);
    wm1.has(o1); // false
    

    12、Math+Number+String+Array+Object APIs

    Number.EPSILON
    Number.isInteger(Infinity) // false
    Number.isNaN("NaN") // false
    
    Math.acosh(3) // 1.762747174039086
    Math.hypot(3, 4) // 5
    Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2
    
    "abcde".includes("cd") // true
    "abc".repeat(3) // "abcabcabc"
    
    Array.from(document.querySelectorAll('*')) // Returns a real Array
    Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
    
    [0, 0, 0].fill(7, 1) // [0,7,7]
    [1, 2, 3].find(x => x == 3) // 3
    [1, 2, 3].findIndex(x => x == 2) // 1
    [1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]
    ["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
    ["a", "b", "c"].keys() // iterator 0, 1, 2
    ["a", "b", "c"].values() // iterator "a", "b", "c"
    
    Object.assign(Point, { origin: new Point(0,0) })
    

    13、Proxy

    Proxy 也就是代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证,说白了,就是在我们访问对象前添加了一层拦截,可以过滤很多操作,而这些过滤,由你来定义。

    var p = new Proxy(target, handler);
    

    targetProxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)

    handler一个对象,其属性是当执行一个操作时定义代理的行为的函数。

    var handler = {
        get: function(target, name) {
            return name in target ?
                target[name] :
                37;
        }
    };
    
    var p = new Proxy({}, handler);
    p.a = 1;
    p.b = undefined;
    
    console.log(p.a, p.b); // 1, undefined
    console.log('c' in p, p.c); // false, 37
    
      let test = {
        name: "小红"
      };
      test = new Proxy(test, {
        get(target, key) {
          console.log('获取了getter属性');
          return target[key];
        }
      });
      console.log(test.name);
    

    上方的案例,我们首先创建了一个test对象,里面有name属性,然后我们使用Proxy将其包装起来,再返回给test,此时的test已经成为了一个Proxy实例,我们对其的操作,都会被Proxy拦截。

    Proxy有两个参数,第一个是target,也就是我们传入的*test对象,另一个则是handler,也就是我们传入的第二个参数,一个匿名对象。在handler中定义了一个名叫get的函数,当我们获取 test的属性时,则会触发此函数。

    14、Symbols

    Symbol是一种基本类型。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的。

    var key = Symbol("key");
    var key2 = Symbol("key");
    key == key2  //false
    

    15、Promise

    1)主要用于异步计算

    2)可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

    3)可以在对象之间传递和操作promise,帮助我们处理队列

    • 同步:假设你去了一家饭店,找个位置,叫服务员,这个时候服务员对你说,对不起我是同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”

    • 异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作。等到系统完成了前面的工作之后,再通过回调或者时间,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺序无关,所以叫做“异步”

    异步操作中常见的语法:

    1、事件监听

    document.getElementById('#start').addEventListener('click', start, false);
    function start() {
      // 响应事件,进行相应的操作
    }
    // jquery on 监听
    $('#start').on('click', start)
    

    2、回调函数

    // 比较常见的有ajax
    $.ajax('http://www.wyunfei.com/', {
     success (res) {
       // 这里可以监听res返回的数据做回调逻辑的处理
     }
    })
    
    // 或者在页面加载完毕后回调
    $(function() {
     // 页面结构加载完成,做回调逻辑处理
    })
    

    NodeJS无阻塞高并发,异步操作是其基本要求

    举例:查询数据库,php第一个任务查询数据,后面有了新任务会被挂起排队;而Node是第一个任务挂起交给数据库去跑,然后去接待第二个任务交给对应的系统组件去处理挂起,接着去接待第三个任务,以此类推,以上操作的处理必然要依赖于异步操作

    异步回调的问题:

    • 之前处理异步是通过纯粹的回调函数的形式进行处理
    • 很容易进入到回调地狱中,剥夺了函数return的能力
    • 问题可以解决,但是难以读懂,而且维护也相当困难

    promise

    • promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)

    • 并未剥夺函数return的能力,因此无需层层传递callback,进行回调函数获取

    • 代码风格,容易理解,便于维护

    • 多个异步等待合并便于解决

      new Promise( function (resolve, reject) { // 一段耗时的异步操作 resolve('成功') // 数据处理完成 // reject('失败') // 数据处理出错 } ).then( (res) => {console.log(res)}, // 成功 (err) => {console.log(err)} // 失败 )

    • resolve的作用是,将Promise对象的状态从“pending”变为“resolved”,在一部操作成功时调用,并将异步操作的结果,作为参数传递出去;reject的作用是,将Promise对象的状态从“pending”变为”rejected",在异步操作失败时调用,并将异步操作爆出的错误,作为参数传递出去

    • promise有三种状态: 

            1、pending  初始状态

            2、fulfilled    操作成功

            3、rejected   操作失败 

            当promise状态发生改变,就会触发then()里的响应函数处理后续步骤,且状态一经改变,不会再变

    new Promise(resolve => {
      setTimeout(() => {
        resolve('hello')
      }, 2000)
    }).then(res => {
      console.log(res)
    })
    
    new Promise(resolve => {
        setTimeout(() => {
          resolve('hello')
        }, 2000)
      }).then(val => {
        console.log(val) //  参数val = 'hello'
        return new Promise(resolve => {
          setTimeout(() => {
            resolve('world')
          }, 2000)
        })
      }).then(val => {
        console.log(val) // 参数val = 'world'
      })
    
    let pro = new Promise(resolve => {
       setTimeout(() => {
         resolve('hello world')
       }, 2000)
     })
     setTimeout(() => {
       pro.then(value => {
       console.log(value) // hello world
     })
     }, 2000)
    

    .then()

    1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
    2、.then()返回一个新的Promise实例,所以它可以链式调用
    3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
    4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
    5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
    6、如果返回其他任何值,则会立即执行下一级.then()

    .then()里面有.then()的情况

    1、因为.then()返回的还是Promise实例
    2、会等里面的then()执行完,再执行外面的

    错误处理两种做法:
    第一种:reject('错误信息').then(() => {}, () => {错误处理逻辑})
    第二种:throw new Error('错误信息').catch( () => {错误处理逻辑})
    推荐使用第二种方式,更加清晰好读,并且可以捕获前面所有的错误(可以捕获N个then回调错误)

    Promise.all() 批量执行

    Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
    它接收一个数组作为参数
    数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
    当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
    有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

    //切菜
        function cutUp(){
            console.log('开始切菜。');
            var p = new Promise(function(resolve, reject){        //做一些异步操作
                setTimeout(function(){
                    console.log('切菜完毕!');
                    resolve('切好的菜');
                }, 1000);
            });
            return p;
        }
    
        //烧水
        function boil(){
            console.log('开始烧水。');
            var p = new Promise(function(resolve, reject){        //做一些异步操作
                setTimeout(function(){
                    console.log('烧水完毕!');
                    resolve('烧好的水');
                }, 1000);
            });
            return p;
        }
    
        Promise.all([cutUp(), boil()])
            .then((result) => {
                console.log('准备工作完毕');
                console.log(result);
            })
    
    Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成
    let p1 = new Promise(resolve => {
            setTimeout(() => {
                resolve('I\`m p1 ')
            }, 1000)
        });
        let p2 = new Promise(resolve => {
            setTimeout(() => {
                resolve('I\`m p2 ')
            }, 2000)
        });
        Promise.race([p1, p2])
            .then(value => {
                console.log(value)
            })
    
    • 常见用法:
      异步操作和定时器放在一起,,如果定时器先触发,就认为超时,告知用户;
      例如我们要从远程的服务家在资源如果5000ms还没有加载过来我们就告知用户加载失败

    • 现实中的用法
      回调包装成Promise,他有两个显而易见的好处:
      1、可读性好
      2、返回 的结果可以加入任何Promise队列


    起源地下载网 » ES6新特性

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元