zoukankan      html  css  js  c++  java
  • ES2015/ES6常用新特性

    = = 总结一下一些常用的 ES6 新特性

    let和const

    let可以声明具有块级作用域的变量,const是用来定义常量的。

    for (let i=0; i<5; i++) {
        console.log('sm')
    }
    
    console.log(i) // Error: i is not defined
    
    const fix = {}
    
    fix.some = 'sm'
    console.log(fix.some) // sm
    
    fix = new Array(2, 3, 3) // Error: "fix" is read-only
    

    const定义引用类型时,是指引用的地址不可变

    arrow function

    箭头函数,箭头函数可以简化匿名函数的写法,并且可以将this静态绑定到对象,而不会因运行上下文的变化而变化:

    function Person() {
        this.name = 'Person'
    
        this.hello = () => {
            console.log(this.name)
        }
    }
    
    var test = new Person
    
    test.hello.bind({name: 'test'})()  //Person
    

    这里在箭头函数里,this对象已经静态绑定到Person这个对象了,不会随着运行上下文的改变而改变。

    函数参数

    默认值 Default

    function plus(x, y=2333) {
        console.log(x + y)
    }
    
    plus(4333) // 6666
    

    ...形参 Rest

    可以通过...形参将参数转化为数组,跟arguments作用类似,只不过箭头函数内部是取不到arguments的值的

    function sum(...values) {
        let result = 0
        for (let val of values) {
            result += val
        }
    
        return result
    }
    
    console.log(sum(2, 3, 5)) //10
    
    sum(...[2, 3, 5]) //等价于 sum.apply(undefined, [2, 3, 5]) -> 10
    
    //所以可以直接这样用
    
    let arr = [45, 23, 4325]
    
    sum(...arr) // 等价于 sum.apply(undefined, arr) -> 4393
    

    Destructuring 解构

    解构赋值,按照一定的规则从数组和对象中提取值,对变量进行赋值

    let [cat, dog] = [
        {hello: 'wang'},
        {hello: 'miao'}
    ]
    
    console.log(cat.hello) //wang
    
    //在取json数据时尤为方便
    
    let jsonData = {
        supplierId: '2333',
        name: 'ORZ',
        code: 6666
    }
    
    let {supplierId: id, name, code} = jsonData
    

    使用BABEL编译后变成这样

    'use strict';
    
    var cat = { hello: 'wang' };
    var dog = { hello: 'miao' };
    
    console.log(cat.hello); //wang
    
    var jsonData = {
        supplierId: '2333',
        name: 'ORZ',
        code: 6666
    };
    
    var id = jsonData.supplierId;
    var name = jsonData.name;
    var code = jsonData.code;
    

    Template String

    这个东西非常有用,在插入大段html内容到文档中时,显得很方便

    let [cat, dog] = ['sss', 'mmm']
    
    console.log(`My cat's name is ${cat} and my dog's name is ${dog}`)
    

    Class

    使用Class语法糖可以很方便地实现类以及继承代码

    class Person {
        constructor(name) {
            this.name = name
        }
    
        hello() {
            console.log(`My name is ${this.name}`)
        }
    }
    
    class Student extends Person {
    
        constructor(name, studentNumber) {
            super(name)
            this.studentNumber = studentNumber
        }
    
        intro() {
            this.hello()
            console.log(`My student Number is ${this.studentNumber}`)
        }
    }
    
    let student = new Student('hwen', 13)
    
    student.intro() 
    //My name is hwen
    //My student Number is 13
    

    super指代父类的实例(也即是父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。
    这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。

    Modules

    在ES6之前,模块化的解决方案一般有两种:CommonJS(服务器端)和AMD(浏览器端,如require.js)

    ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。

    我的理解是,ES6的模块化是亲生的。。。所以可以做到在解析时就能确定模块的依赖关系,而CommonJS和AMD的模块是第三方库,只能在运行时确定模块的依赖关系。

    需要注意的是大括号里的变量名需与模块里export的接口名称相同,引入其他模块的默认值(default)可以直接写在大括号外

    //some.js
    export defalut 'worker'
    export function sm() {
        return 'do something'
    }
    export const time = 1000*60*60
    
    //index.js
    import people, { sm as something, time } from './some'
    
    let work = something()
    
    console.log(`${people} ${work} for ${time / (1000 * 60)} min`) 
    //worker do something for 60 min
    

    详情-阮一峰的电子书:http://es6.ruanyifeng.com/#docs/intro

  • 相关阅读:
    初识Redis
    一次kafka的offset回退事件及相关知识点
    接口透传
    看懂Oracle执行计划
    Oracle中merge into的使用
    动态规划算法:0/1背包问题 (0/1 Knapsack Problem)
    动态规划算法:硬币找零(Minimum Coin Change)
    链表:按照左右半区的方式重新组合单链表
    链表:删除链表中倒数第K个节点
    链表:合并两个有序链表
  • 原文地址:https://www.cnblogs.com/hwencc/p/5371807.html
Copyright © 2011-2022 走看看