ECMAScript6的新特性简述

ECMAScript6

前言

原文参考
伯乐在线-吴鹏煜
链接:http://web.jobbole.com/87140/

1.ES6中的默认参数

以前我们是这样来定义默认参数的:

var link = function(height, color, url) {
    var height = height || 50
    var color = color || 'red'
    var url = url || 'http://azat.co'
}

但是这么定义有个问题,因为如果参数的值是0的时候,默认会成为’false’,这在赋值的时候就比较尴尬了。
现在ES6的写法是:

var link = function(height = 50, color = 'red', url = 'http://azat/co') {

}

2.ES6中的模板语法

ES5里,字符串的连接一般如下所示:

var str = aname + ' loves ' + 'bname';
var url = 'http://www.baidu.com:3000/' + pair_id

但是,如果需要连接的变量太多,或者字符串的结构较为复杂,就很容易出现错误,所以ES6引入了反引号包裹字符串。这样,在反引号包裹的字符串里,不再需要通过’+’来连接,而是直接用 aname {bname}来引用变量。

var str = `${aname} loves ${bname}`;
var url = `http://www.baidu.com:3000/${pair_id}`

3.ES6中的多行字符串

在ES5中,如果需要连接的字符串,一般会换行写,比如

var str = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.nt'
    + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; 

同样,在ES6中,只需要充分得利用好反引号“

var str = `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.
    you can you up, no can no bb`

4.ES6中的拆包表达式

ES5中有很多这样的应用场景,比如传递的参数是一个对象Object,需要将对象的属性值Object.data1和Object.data2赋值给data1和data2.

var data = $('body').data(),
data1 = data.data1
data2 = data.data2

但是在ES6中就简单了。

var { data1, data2 } = $('body').data()

数组中也可以使用。

5.ES6中改进的对象表达式

ES5中一个典型的对象如下:

var serviceBase = {port: 3000, url:'azat.co'},
    getAccounts = function() {
        return [1,2,3];
    };

var accountServiceES5 = {
    port: serviceBase.port,
    url: serviceBase.url,
    getAccounts: getAccounts,
    toString: function() {
        return JSON.stringify(this.valueOf())
    },
    getUrl: function() {
        return 'http://' + this.url + ':' + this.port
    },
    valueOf_1_2_3: getAccounts()
}

可以用Object.create方法来让serviceBase称为accountServiceES6的prototype从而实现继承。
ES6改进:

var serviceBase = {port: 3000, url:'azat.co'},
    getAccounts = function() {
        return [1,2,3];
    };

var accountServiceES5 = {
    // port: serviceBase.port
    // url: serviceBase.url
    _proto_: serviceBase,
    // getAccounts: getAccounts
    getAccounts,
    toString: function() {
        return JSON.stringify(this.valueOf())
    },
    getUrl: function() {
        return 'http://' + this.url + ':' + this.port
    },
    valueOf_1_2_3: getAccounts()
}

6.ES6中的箭头函数
ES5中,函数内部的this对象指向的是引用函数的对象。
比如:

 var vm = this;
 $('.btn').click(function(event){
    vm.sendData()
 })

但是在ES6中,箭头函数内部的this对象指的还是之前的作用域。

 $('.btn').click((event) =>{
    this.sendData()
 })

注意下,ES6中箭头表达式有隐式的写法:

map(value => `hahahahah`)

如果箭头函数所在语句只有一行时,它会默认返回值。
如果是多行的,需要用return来显式表达返回的值。

7.ES6中的Promise

看看ES5中的一个延迟执行:

setTimeout(function(){
    console.log("haha!")
}, 1000)

可以用ES6中的Promise重写

// 创建一个新的Promise实例,传递一个参数,这个参数是个函数
// 该函数接受两个参数,一个是resolve,代表成功回调,另一个是reject,指失败回调

var wait1000 = new Promise((resolve, reject) => {
    setTimeout(resolve, 1000);
}).then(() => {
    console.log("haha!");
})

目前还没有看到有任何的好处,
看下一例子:

// 1秒后先显示'haha1',再过一秒显示'haha2'
setTimeout(function() {
    console.log('haha1')
    setTimeout(function() {
        console.log('haha2')
    },1000)
},1000)

可以用promise重写:

// wait1000是一个新的promise实例
// wait1000()表示1秒后将调用成功回调函数resolve
// 而这个成功回调函数resolve里又重新返回了个新的promise实例
// 新的promise实例wait1000()继续1秒后调用成功回调resolve
var wait1000 = new Promise((resolve, reject) => {
    setTimeout(resolve, 1000)
})
wait1000().then(function() {
    console.log('haha1');
    return wait1000();
}).then(function() {
    console.log('haha2');
})

如果Promise实例在pending状态时,传给resolve()的是一个Promise对象,那么在then()里面,会等待这个Promise对象的完成,这么说会有点抽象,看下面的例子:

var promise4 = new Promise((resolve, reject) => {
    var promise4_1 = new Promise((resolve, reject) => {
        console.log("promise4_1 starts");
        setTimeout(() => {
            resolve("this is promise4_1 resolve");
        }, 2000);
    })
    resolve(promise4_1);
}).then((msg) => {
    console.log(msg);
    console.log("haha");
})

// promise4_1 starts
// this is promise4_1 resolve
// haha
var promise4 = new Promise((resolve, reject) => {
    var promise4_1 = new Promise((resolve, reject) => {
        console.log("promise4_1 starts");
        setTimeout(() => {
            resolve("this is promise4_1 resolve");
        }, 2000);
    })
    resolve(promise4_1);
}).then((msg) => {
    console.log("haha");
    console.log(msg);
})

// promise4_1 starts
// haha
// this is promise4_1 resolve

块级作用域的let和const

let类似于var,可以将变量作用域限制在当前块里。
我们开始用{}来定义块。

function calculateTotalAmount() {
    let a = 0;
    {
        let a = 1;
        return a;    //a为1
    }
    return a;     // a为0
}

const定义个不可变的变量。

9.ES6中的类

ES6的类会用prototype来实现而不是function。
现在有一个baseModel类,其中我们可以定义构造函数和getName()方法。

class baseModel{
    constructor(options={},data=[]){
        this.name= 
        this.url=
        this.data=
        this.options=
    }

    getName() {

    }
}

10.ES6中的模块化

ES5中可以用script标签和IIFE(立即执行函数),或者其他的像AMD之类的库,但是在ES6中可以用export来暴露类。
ES5里:

//module.js
module.exports = {
    port: 3000,
    getAccounts: function() {
        ...
    }
}

// main.js
var service = require('module.js')

但是在ES6中,我们可以用export和import
比如:

// module.js
export var port = 3000
export function getAccounts(url) {
    ...
}

// main.js
import {port, getAccounts} from 'module'
// 或
import * as service from 'module'

如何使用ES6(Babel)

并不是所有的浏览器都支持ES6,如果想要马上用ES6,需要准备个像Babel这样的编译器。
Babel对Gulp、Grunt和Webpack都有对应的插件。
比如对Gulp
npm install --save-dev gulp-babel
在gulpfile.js中,定义这么一个任务,将src目录下的app.js文件编译到build目录下:

// gulpfile.js
var gulp = require('gulp'),
    babel = require('gulp-babel');

gulp.task('build', function(){
    return gulp.src('src/app.js')
    .pipe(babel())
    .pipe(gulp.dest('build'))
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值