ECMAScript 6.0於2015 年 6 月正式釋出了,成為JavaScript 語言的下一代標準。ES6增加的語言特性解決了哪些問題,會給開發者哪些便利,是本文主要探討的問題。
增加了對unicode字元的支援
ES5對字元的處理有限,無法很好地處理碼點大於0xFFFF
的字元。
ES6在string
原生方法中支援碼點大於0xFFFF
的字元,取得碼點或是遍歷,都可以直接操作;並且對字元不同的表示方法做了統一化。
在正規表示式裡新增\u
\s
修飾符,使得正則對特殊字元的匹配不需要開發者額外處理。
非同步程式設計
ES6 前非同步程式設計的解決方式:
- 回撥函式
- 事件監聽
- 釋出/訂閱
- 自定義promise
Promise
ES6提供了原生的Promise物件,統一了用法和標準。
- 物件的狀態不受外界影響。能夠方便地獲取非同步操作的狀態、賦予對應操作。
- 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
缺點
- 無法取消Promise,一旦新建它就會立即執行,無法中途取消。
- 如果不設定回撥函式,或在catch中再次丟擲錯誤。Promise內部丟擲的錯誤,不會反應到外部。
- 當處於pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
Generator
Generator 函式形式上與普通函式無異,特徵有二
function
關鍵字與函式名之間有一個星號;- 函式體內部使用
yield
表示式,來表明函式執行的狀態。
意義:
-
可以交出函式的執行權(即暫停執行)
-
函式體內外的資料交換
可以在 Generator 函式執行的不同階段,調整函式行為。包括從外部向內部注入不同的值,控制返回和丟擲錯誤。
async
(ES2017 標準引入)
從理解上來說, async
函式相當於把Generator 函式的星號(*
)替換成async
,將yield
替換成await
。
但相比較generate而言,內建執行器,有更易於理解的語義。
async
函式返回一個 Promise 物件,可以使用then
方法新增回撥函式。async
函式內部return
語句返回的值,會成為then
方法回撥函式的引數。
當函式執行的時候,一旦遇到await
就會先返回,等到非同步操作完成,再接著執行函式體內後面的語句。
減少全域性變數和方法
比如,ES6 將全域性方法parseInt()和parseFloat(),移植到Number物件上面。 逐步減少全域性性方法,使得語言逐步模組化。
程式碼作用域
變數的宣告方式
增加let
,const
的變數宣告方式,不存在變數提升,不允許重複宣告,使語言使用更加嚴謹。
塊級作用域
使得變數的作用域更利於管理,也使得立即執行函式表示式不再必要了。
箭頭函式
讓this繫結定義時所在的作用域,而不是指向執行時所在的作用域,也使得表達更加簡潔。
語法糖
ES6推出了模版字串,使得多行字串及夾雜變數的字串寫起來更加方便。
物件增加屬性名錶達式與簡潔表示法。
增加遍歷器機制,為各種不同的資料結構提供統一的訪問機制。
增加解構的語法,取值更直觀方便。
增加class關鍵字來定義類,過去,生成例項物件的傳統方法是通過建構函式。不再和傳統面嚮物件語言有大的差異。且支援extends。
超程式設計
引入Proxy
物件,可以攔截某些操作並實現自定義行為。
引入 Rflect
物件,可以獲取預設操作,可以將預設操作從處理程式轉發到目標。
Symbol
symbol 是一種基本資料型別 ,提供一種機制,保證每個屬性的名字都是獨一無二,從根本上防止屬性名的衝突。
更多的原生方法
ES6提供了更多的原生方法,避免了開發者重複造輪子。如字串的查詢。
-
正則的匹配規則,如新加的y、s修飾符。
-
增加了set、map的資料結構。
-
增加
Number.EPSILON
等數值方法,使得對數值操作易於在精度方面進行控制。 //雖然JavaScript 不適合進行科學和金融方面的精確計算 -
增加對物件的操作與讀取的API。
優化
對尾遞迴進行優化,賦予javscript執行復雜度更高的方法的能力。
參考