ES6解決了什麼問題

ES6解決了什麼問題

ECMAScript6.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運行復雜度更高的方法的能力。

ES6解決了什麼問題


分享到:


相關文章: