ES6新特性

ES6中比較實(shí)用的八個(gè)特性:

1.塊級作用域的let和const
2.箭頭函數(shù)
3.默認(rèn)參數(shù)
4.模版表達(dá)式
5.多行字符串
6.Promise
7.類
8.模塊化

1. 塊級作用域的let和const

let是一個(gè)更新的var,可以讓你把變量作用域限制在當(dāng)前塊里。我們用{}來定義塊,但是在ES5中這些花括號起不到任何作用。

function test (e) {
  var num = 0
  if (e) {
    var num = 1
  }
  {  // 更多的塊
    var num = 10
    {
      var num = 100
      }
  }  
  return num
}
 
console.log(test(true))

運(yùn)行結(jié)果將會(huì)是100,簡直變態(tài)···
在ES6中,我們用let來限制變量作用域?yàn)楹瘮?shù)內(nèi)。

function test (e) {
  let num = 0 
  if (e) {
    let num = 1 
  } 
  { // 更多的塊
    let num = 10 
    {
      let num = 100 
      }
  }  
  return num
}
 
console.log(test(true))

運(yùn)行結(jié)果是0。
說到const,就簡單多了。他僅僅產(chǎn)生是一個(gè)不可變的變量,并且他的作用域也像let一樣只有塊級。為了演示,這里有定義了一堆常量,并且由于作用域的原因,這些定義都是有效的。

function test(e) {
  const num = 0  
  if (e) {
    const num = 1 
  } 
  { // 更多的塊
    const num = 10
    {
      const num = 100
      }
  }  
  return num
}
 
console.log(test(true))

let和const讓這門語言變得更加復(fù)雜,沒有這些的時(shí)候我們只有一條路可以走,但是現(xiàn)在可以要考慮更多的情景。

2. ES6中的箭頭函數(shù)

這些箭頭最神奇的地方在于他會(huì)讓你寫正確的代碼。比如,this
在上下文和函數(shù)中的值應(yīng)當(dāng)是相同的,它不會(huì)變化,通常變化的原因都是因?yàn)槟銊?chuàng)建了閉包。
使用箭頭函數(shù)可以讓我們不再用that = this
或者self = this
或者_(dá)this = this
或者.bind(this)
這樣的代碼,比如,這些代碼在ES5中就特別丑。

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

這是在ES6中去掉_this = this
之后:

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

注意,在ES6中你可以合理的把箭頭函數(shù)和舊式 function 函數(shù)混用。當(dāng)箭頭函數(shù)所在語句只有一行時(shí),它就會(huì)變成一個(gè)表達(dá)式,它會(huì)直接返回這個(gè)語句的值。但是如果你有多行語句,你就要明確的使用return。

3. ES6中的默認(rèn)參數(shù)

以前我們要這樣子來定義默認(rèn)參數(shù):

var link = function (height, color, url) {
    var height = height || 100
    var color = color || 'skyblue'
    var url = url || 'http://baidu.com'
    ...
}

在ES6中,我們可以把這些默認(rèn)值直接放在函數(shù)簽名中。

var link = function(height = 100, color = 'skyblue', url = 'http://baidu.com') {
  ...
}

4. ES6中的模版表達(dá)式

在ES5中,我們非得把字符串破開變成這樣:

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

在ES6中我們有了新語法,在反引號包裹的字符串中,使用${name}語法來表示模板字符:

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

5. ES6中的多行字符串

在ES5中想要實(shí)現(xià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.'

但是在ES6中,只要充分利用反引號。

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.`

6. ES6中的Promise

在ES6中有一個(gè)標(biāo)準(zhǔn)的Promise實(shí)現(xiàn),可以解決嵌套過深的問題。
舉一個(gè)延遲異步執(zhí)行,用setTimeout實(shí)現(xiàn):

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

我們可以用ES6中的Promise重寫:

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

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

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

到現(xiàn)在為止,我們只是單純增加了代碼的行數(shù),還明顯沒有帶來任何好處。但是如果我們有更多復(fù)雜的邏輯內(nèi)嵌在setTimeout()
中的回調(diào)時(shí)好處就來了:

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

可以用ES6中的Promise重寫:

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

7. ES6中的類

在ES5中,因?yàn)闆]有class關(guān)鍵字(但它是毫無作用的保留字),類的創(chuàng)建和使用十分麻煩。ES6的類會(huì)用prototype來實(shí)現(xiàn)而不是function?,F(xiàn)在有一個(gè)baseModel類,其中我們可以定義構(gòu)造函數(shù)和getName()
方法。

class baseModel {
  constructor(options = {}, data = []) { // class 屬性
        this.name = 'Base'
        this.url = 'http://baidu.com'
        this.data = data
        this.options = options
    }
 
    getName() { // class 方法
        console.log(`Class name: ${this.name}`)
    }
}

options和data用了默認(rèn)參數(shù),
而且方法名再也不用加上function。

8. ES6中的模塊化

ES6之前JavaScript并沒有對模塊化有過原生的支持,于是有人創(chuàng)造出AMD(RequireJS),CommenJS等等,現(xiàn)在終于有import和export運(yùn)算符來實(shí)現(xiàn)了。
ES5中你會(huì)用script標(biāo)簽和IIFE(立即執(zhí)行函數(shù)),或者是其他的像AMD之類的庫,但是ES6中你可以用export來暴露你的類。然后用Browserfy來瀏覽器化。
比如我們有一個(gè)port變量和getAccounts方法,在ES5中需要這么實(shí)現(xiàn):

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

在ES5的main.js中,用require('模塊')來導(dǎo)入:

var service = require('module.js')
console.log(service.port) // 3000

但是在ES6中,我們用export和import。比如這是ES6中的module.js文件:

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

在需要引入的main.js文件中,可以用import {名稱} from '模塊'語法:

import {port, getAccounts} from 'module'
console.log(port) // 3000

或者就直接在main.js
中引入所有的變量:

import * as service from 'module'
console.log(service.port) // 3000

由于現(xiàn)在的大部分瀏覽器還不支持ES6,,如果想馬上就用上ES6,我們需要一個(gè)像Babel這樣的編譯器。你可以把他當(dāng)獨(dú)立工具用,也可以將他集成到構(gòu)建系統(tǒng)里,Babel對Gulp,Grunt和Webpack都有對應(yīng)的插件。


安裝Gulp插件示例:

$ npm install --save-dev gulp-babel

在gulpfile.js中,定義這么一個(gè)任務(wù),將src目錄下的app.js文件編譯到build目錄下:

var gulp = require('gulp'),
  babel = require('gulp-babel')
 
gulp.task('build', function () {
  return gulp.src('src/app.js')
    .pipe(babel())
    .pipe(gulp.dest('build'))
})

Node.js和ES6
對于Node.js,你可以用構(gòu)建工具或者直接用獨(dú)立模塊babel-core

$ npm install --save-dev babel-core

然后在Node.js中調(diào)用這個(gè)函數(shù):

require('babel-core').transform(es5Code, options)

ES6的一些總結(jié)
ES6中還有很多比較不錯(cuò)的特性,如:
Math / Number / String/ Array/ Object中新的方法
二進(jìn)制和八進(jìn)制數(shù)據(jù)類型
自動(dòng)展開多余參數(shù)
For of循環(huán)
Symbols
尾部調(diào)用優(yōu)化generator
更新的數(shù)據(jù)結(jié)構(gòu)(如Map和Set)

ES6相對于ES5的確是有比較大的優(yōu)化,必然是未來發(fā)展的趨勢所在,所以大家還是抓緊學(xué)習(xí)使用ES6吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內(nèi)容

  • let和const命令 var:聲明變量,更多的是全局作用域,存在變量提升 let:聲明變量,存在于塊級作用域,不...
    zhangivon閱讀 2,482評論 1 13
  • ECMAScript 6.0(以下簡稱ES6)是、JavaScript語音的下一代標(biāo)準(zhǔn),已經(jīng)在2015年6月正式發(fā)...
    Leisure_blogs閱讀 499評論 1 2
  • 一、ES6簡介 ? 歷時(shí)將近6年的時(shí)間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,096評論 8 25
  • 首先感謝Carnia幫我指出ES6箭頭函數(shù)中this指向的錯(cuò)誤,此次主要更新箭頭函數(shù)中this指向問題。 ECMA...
    范小飯_閱讀 8,805評論 7 21
  • 1.定義函數(shù)2.創(chuàng)建類3.模塊4.let與const5.箭頭函數(shù) arrow functions6.字符串模板 t...
    九又四分之三o閱讀 254評論 0 0