---恢復(fù)內(nèi)容開始---

ES6(ECMAScript2015)的出現(xiàn),無疑給前端開發(fā)人員帶來了新的驚喜,它包含了一些很棒的新特性,可以更加方便的實(shí)現(xiàn)很多復(fù)雜的操作,提高開發(fā)人員的效率。
本文主要針對ES6做一個(gè)簡要介紹。 也許你還不知道ES6是什么, 實(shí)際上, 它是一種新的javascript規(guī)范。在這個(gè)大家都很忙碌的時(shí)代,如果你想對ES6有一個(gè)快速的了解,那么請繼續(xù)往下讀,去了解當(dāng)今最流行的編程語言JavaScript最新一代的十大特性。
以下是ES6排名前十的最佳特性列表(排名不分先后):

 

 

  1. Default Parameters(默認(rèn)參數(shù)) in ES6

  2. Template Literals (模板文本)in ES6

  3. Multi-line Strings (多行字符串)in ES6

  4. Destructuring Assignment (解構(gòu)賦值)in ES6

  5. Enhanced Object Literals (增強(qiáng)的對象文本)in ES6

  6. Arrow Functions (箭頭函數(shù))in ES6

  7. Promises in ES6

  8. Block-Scoped Constructs Let and Const(塊作用域構(gòu)造Let and Const)

  9. Classes(類) in ES6

  10. Modules(模塊) in ES6。

這里只列出了10條比較常用的特性。
首先回顧一下JavaScript的歷史,不清楚歷史的人,很難理解JavaScript為什么會這樣發(fā)展。下面就是一個(gè)簡單的JavaScript發(fā)展時(shí)間軸:
1、1995:JavaScript誕生,它的初始名叫LiveScript。
2、1997:ECMAScript標(biāo)準(zhǔn)確立。
3、1999:ES3出現(xiàn),與此同時(shí)IE5風(fēng)靡一時(shí)。
4、2000–2005: XMLHttpRequest又名AJAX, 在Outlook Web Access (2000)、Oddpost (2002),Gmail (2004)和Google Maps (2005)大受重用。
5、2009: ES5出現(xiàn),(就是我們大多數(shù)人現(xiàn)在使用的)例如foreach,Object.keys,Object.create和JSON標(biāo)準(zhǔn)。
6、2015:ES6/ECMAScript2015出現(xiàn)。

1.Default Parameters(默認(rèn)參數(shù)) in ES6

  還記得我們以前不得不通過下面方式來定義默認(rèn)參數(shù):

  

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

一切工作都是正常的,直到參數(shù)值是0后,就有問題了,因?yàn)樵贘avaScript中,0表示false,它是默認(rèn)被hard-coded的值,而不能變成參數(shù)本身的值。當(dāng)然,如果你非要用0作為值,我們可以忽略這一缺陷并且使用邏輯OR就行了!但在ES6,我們可以直接把默認(rèn)值放在函數(shù)申明里:

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

  順便說一句,這個(gè)語法類似于Ruby

  

2.Template Literals(模板對象) in ES6

  在其它語言中,使用模板和插入值是在字符串里面輸出變量的一種方式。因此,在ES5,我們可以這樣組合一個(gè)字符串:

  

var name = 'Your name is ' + first + ' ' + last + '.';var url = 'http://localhost:3000/api/messages/' + id;

  幸運(yùn)的是,在ES6中,我們可以使用新的語法$ {NAME},并把它放在反引號里:

var name = `Your name is ${first} ${last}. `;var url = `http://localhost:3000/api/messages/${id}`;

 

3.Multi-line Strings (多行字符串)in ES6

  ES6的多行字符串是一個(gè)非常實(shí)用的功能。在ES5中,我們不得不使用以下方法來表示多行字符串:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

var roadPoem = 'Then took the other, as just as fair,nt'
    + 'And having perhaps the better claimnt'
    + 'Because it was grassy and wanted wear,nt'
    + 'Though as for that the passing therent'
    + 'Had worn them really about the same,nt';var fourAgreements = 'You have the right to be you.n
    You can only be you when you do your best.';

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  然而在ES6中,僅僅用反引號就可以解決了:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

var roadPoem = `Then took the other, as just as fair,
    And having perhaps the better claim
    Because it was grassy and wanted wear,
    Though as for that the passing there
    Had worn them really about the same,`;var fourAgreements = `You have the right to be you.
    You can only be you when you do your best.`;

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

[ 這里的反引號是(shift + ~) ]

 

4.Destructuring Assignment (解構(gòu)賦值)in ES6

  解構(gòu)可能是一個(gè)比較難以掌握的概念。先從一個(gè)簡單的賦值講起,其中house 和 mouse是key,同時(shí)house 和mouse也是一個(gè)變量,在ES5中是這樣:

var data = $('body').data(), // data has properties house and mouse
 house = data.house,
 mouse = data.mouse;

  以及在node.js中用ES5是這樣:

var jsonMiddleware = require('body-parser').jsonMiddleware ;var body = req.body, // body has username and password
   username = body.username,
   password = body.password;

  在ES6,我們可以使用這些語句代替上面的ES5代碼:

var { house, mouse} = $('body').data(); // we'll get house and mouse variablesvar {jsonMiddleware} = require('body-parser');var {username, password} = req.body;

  這個(gè)同樣也適用于數(shù)組,非常贊的用法:

var [col1, col2]  = $('.column'),
   [line1, line2, line3, , line5] = file.split('n');

  我們可能需要一些時(shí)間來習(xí)慣解構(gòu)賦值語法的使用,但是它確實(shí)能給我們帶來許多意外的收獲。

5.Enhanced Object Literals (增強(qiáng)的對象字面量)in ES6

使用對象文本可以做許多讓人意想不到的事情!通過ES6,我們可以把ES5中的JSON變得更加接近于一個(gè)類。
下面是一個(gè)典型ES5對象文本,里面有一些方法和屬性:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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()
}

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  如果我們想讓它更有意思,我們可以用Object.create從serviceBase繼承原型的方法:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  我們知道,accountServiceES5ObjectCreate 和accountServiceES5 并不是完全一致的,因?yàn)橐粋€(gè)對象(accountServiceES5)在proto對象中將有下面這些屬性:

 

為了方便舉例,我們將考慮它們的相似處。所以在ES6的對象文本中,既可以直接分配getAccounts: getAccounts,也可以只需用一個(gè)getAccounts,此外,我們在這里通過proto(并不是通過’proto’)設(shè)置屬性,如下所示:

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

  另外,我們可以調(diào)用super防范,以及使用動(dòng)態(tài)key值(valueOf_1_2_3):

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

toString() { return JSON.stringify((super.valueOf()));
 },
 getUrl() {return "http://" + this.url + ':' + this.port},
 [ 'valueOf_' + getAccounts().join('_') ]: getAccounts()
};
console.log(accountService)

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  ES6對象文本是一個(gè)很大的進(jìn)步對于舊版的對象文本來說。

6.Arrow Functions in(箭頭函數(shù)) ES6

這是我迫不及待想講的一個(gè)特征,CoffeeScript 就是因?yàn)樗S富的箭頭函數(shù)讓很多開發(fā)者喜愛。在ES6中,也有了豐富的箭頭函數(shù)。這些豐富的箭頭是令人驚訝的因?yàn)樗鼈儗⑹乖S多操作變成現(xiàn)實(shí),比如,
以前我們使用閉包,this總是預(yù)期之外地產(chǎn)生改變,而箭頭函數(shù)的迷人之處在于,現(xiàn)在你的this可以按照你的預(yù)期使用了,身處箭頭函數(shù)里面,this還是原來的this。
有了箭頭函數(shù)在ES6中, 我們就不必用that = this或 self = this 或 _this = this 或.bind(this)。例如,下面的代碼用ES5就不是很優(yōu)雅:

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

  在ES6中就不需要用 _this = this:

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

不幸的是,ES6委員會決定,以前的function的傳遞方式也是一個(gè)很好的方案,所以它們?nèi)匀槐A袅艘郧暗墓δ堋?br/>下面這是一個(gè)另外的例子,我們通過call傳遞文本給logUpperCase() 函數(shù)在ES5中:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

var logUpperCase = function() {  var _this = this;  this.string = this.string.toUpperCase();  return function () {    return console.log(_this.string);
  }
}

logUpperCase.call({ string: 'ES6 rocks' })();

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  而在ES6,我們并不需要用_this浪費(fèi)時(shí)間:

var logUpperCase = function() {  this.string = this.string.toUpperCase();  return () => console.log(this.string);
}
logUpperCase.call({ string: 'ES6 rocks' })();

請注意,只要你愿意,在ES6中=>可以混合和匹配老的函數(shù)一起使用。當(dāng)在一行代碼中用了箭頭函數(shù),它就變成了一個(gè)表達(dá)式。它將暗地里返回單個(gè)語句的結(jié)果。如果你超過了一行,將需要明確使用return。
這是用ES5代碼創(chuàng)建一個(gè)消息數(shù)組:

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9'];var messages = ids.map(function (value) {  return "ID is " + value; // explicit return});

  用ES6是這樣:

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9'];var messages = ids.map(value => `ID is ${value}`); // implicit return

請注意,這里用了字符串模板。
在箭頭函數(shù)中,對于單個(gè)參數(shù),括號()是可選的,但當(dāng)你超過一個(gè)參數(shù)的時(shí)候你就需要他們。
在ES5代碼有明確的返回功能:

var ids = ['5632953c4e345e145fdf2df8', '563295464e345e145fdf2df9'];var messages = ids.map(function (value, index, list) {  return 'ID of ' + index + ' element is ' + value + ' '; // explicit return});

  在ES6中有更加嚴(yán)謹(jǐn)?shù)陌姹?,參?shù)需要被包含在括號里并且它是隱式的返回:

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9'];var messages = ids.map((value, index, list) => `ID of ${index} element is ${value} `); // implicit return

7. Promises in ES6

Promises 是一個(gè)有爭議的話題。因此有許多略微不同的promise 實(shí)現(xiàn)語法。Q,bluebird,deferred.js,vow, avow, jquery 一些可以列出名字的。也有人說我們不需要promises,僅僅使用異步,生成器,回調(diào)等就夠了。但令人高興的是,在ES6中有標(biāo)準(zhǔn)的Promise實(shí)現(xiàn)。
下面是一個(gè)簡單的用setTimeout()實(shí)現(xiàn)的異步延遲加載函數(shù):

setTimeout(function(){
  console.log('Yay!');
}, 1000);

  在ES6中,我們可以用promise重寫:

var wait1000 =  new Promise(function(resolve, reject) {
  setTimeout(resolve, 1000);
}).then(function() {
  console.log('Yay!');
});

  或者用ES6的箭頭函數(shù):

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

  到目前為止,代碼的行數(shù)從三行增加到五行,并沒有任何明顯的好處。確實(shí),如果我們有更多的嵌套邏輯在setTimeout()回調(diào)函數(shù)中,我們將發(fā)現(xiàn)更多好處:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

setTimeout(function(){
  console.log('Yay!');
  setTimeout(function(){
    console.log('Wheeyee!');
  }, 1000)
}, 1000);

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  在ES6中我們可以用promises重寫:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

var wait1000 =  ()=> new Promise((resolve, reject)=> {setTimeout(resolve, 1000)});
wait1000()
    .then(function() {
        console.log('Yay!')        return wait1000()
    })
    .then(function() {
        console.log('Wheeyee!')
    });

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

還是不確信Promises 比普通回調(diào)更好?其實(shí)我也不確信,我認(rèn)為一旦你有回調(diào)的想法,那么就沒有必要額外增加promises的復(fù)雜性。
雖然,ES6 有讓人崇拜的Promises 。Promises 是一個(gè)有利有弊的回調(diào)但是確實(shí)是一個(gè)好的特性,更多詳細(xì)的信息關(guān)于promise:Introduction to ES6 Promises.

8.Block-Scoped Constructs Let and Const(塊作用域和構(gòu)造let和const)**

在ES6代碼中,你可能已經(jīng)看到那熟悉的身影l(fā)et。在ES6里let并不是一個(gè)花俏的特性,它是更復(fù)雜的。Let是一種新的變量申明方式,它允許你把變量作用域控制在塊級里面。我們用大括號定義代碼塊,在ES5中,塊級作用域起不了任何作用:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

function calculateTotalAmount (vip) {  var amount = 0;  if (vip) {    var amount = 1;
  }
  { // more crazy blocks!
    var amount = 100;
    {      var amount = 1000;
    }
  }  return amount;
}
console.log(calculateTotalAmount(true));

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  結(jié)果將返回1000,這真是一個(gè)bug。在ES6中,我們用let限制塊級作用域。而var是限制函數(shù)作用域。

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

function calculateTotalAmount (vip) {  var amount = 0; // probably should also be let, but you can mix var and let
  if (vip) {
    let amount = 1; // first amount is still 0  }
  { // more crazy blocks!
    let amount = 100; // first amount is still 0    {
      let amount = 1000; // first amount is still 0    }
  }  return amount;
}

console.log(calculateTotalAmount(true));

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

這個(gè)結(jié)果將會是0,因?yàn)閴K作用域中有了let。如果(amount=1).那么這個(gè)表達(dá)式將返回1。談到const,就更加容易了;它就是一個(gè)不變量,也是塊級作用域就像let一樣。下面是一個(gè)演示,這里有一堆常量,它們互不影響,因?yàn)樗鼈儗儆诓煌膲K級作用域:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

function calculateTotalAmount (vip) {  const amount = 0;  if (vip) {    const amount = 1;
  }
  { // more crazy blocks!
    const amount = 100 ;
    {      const amount = 1000;
    }
  }  return amount;
}
console.log(calculateTotalAmount(true));

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

  從我個(gè)人看來,let 和const使這個(gè)語言變復(fù)雜了。沒有它們的話,我們只需考慮一種方式,現(xiàn)在有許多種場景需要考慮。

 

9. Classes (類)in ES6

如果你喜歡面向?qū)ο缶幊蹋∣OP),那么你將喜愛這個(gè)特性。以后寫一個(gè)類和繼承將變得跟在facebook上寫一個(gè)評論那么容易。
類的創(chuàng)建和使用真是一件令人頭疼的事情在過去的ES5中,因?yàn)闆]有一個(gè)關(guān)鍵字class (它被保留,但是什么也不能做)。在此之上,大量的繼承模型像pseudo classical,classicalfunctional 更加增加了混亂,JavaScript 之間的宗教戰(zhàn)爭只會更加火上澆油。
用ES5寫一個(gè)類,有很多種方法,這里就先不說了?,F(xiàn)在就來看看如何用ES6寫一個(gè)類吧。ES6沒有用函數(shù), 而是使用原型實(shí)現(xiàn)類。我們創(chuàng)建一個(gè)類baseModel ,并且在這個(gè)類里定義了一個(gè)constructor 和一個(gè) getName()方法:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

class baseModel {
  constructor(options, data) { // class constructor,node.js 5.6暫時(shí)不支持options = {}, data = []這樣傳參
    this.name = 'Base';    this.url = 'http://azat.co/api';    this.data = data;    this.options = options;
   }

    getName() { // class method
        console.log(`Class name: ${this.name}`);

http://www.cnblogs.com/Mousika/p/7120065.html