1. 程式人生 > >ES6的常用特性

ES6的常用特性

1.變數宣告let && const

let用於宣告變數,const用於宣告常量,兩者都為塊級作用域。

const宣告的常量被設定完成之後就不能修改,如果宣告的是一個物件,那麼可以改變物件的值,只要記憶體地址不變即可。

let宣告的變數不存在變數提升特性,而var宣告的變數存在變數宣告提升,即變數可以在宣告之前使用,值為undefined。

const在宣告時必須被賦值。

let不允許在相同作用域內重複宣告同一個變數。

2.解構賦值

解構:ES6允許按照一定模式從陣列和物件中提取值,然後對變數進行賦值。

解構賦值允許指定預設值。(如果一個數組成員不嚴格等於===undefined,那麼預設值不會生效)。

陣列的解構賦值是由其位置決定,物件的解構賦值由其鍵名決定。

字串也可以解構賦值,被轉換成一個類似陣列的物件。

解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件。

null和undefined無法轉換為物件,所以會報錯。

3.模板字串(Template String)

模板字串使用反引號(``)來代替普通字串中的雙引號和單引號,它可以被當作普通字串使用,也可以用來定義多行字串,或者在字串中嵌入變數。

將表示式嵌入字串中進行拼接時,用${}來界定。

如果在模板字串中需要使用反引號,則在其前面使用反斜槓轉義。

使用模板字串表示多行字串,所有的空格和縮排都會被保留在輸出中。

4.箭頭函式

ES6中的箭頭函式是函式的一種簡寫形式。

箭頭函式幾點注意事項:

(1)this關鍵字指向當前上下文(即定義時所在物件,而不是呼叫時所在物件)。

(2)箭頭函式不可以被當做建構函式,也就是說不能使用new命令。

(3)不可以使用arguments物件,如果需要獲取引數,可以使用rest引數。

(4)箭頭函式不能用作Generator函式,不能使用yield命令。

5.函式的引數預設值

在ES6之前,不能直接為函式的引數指定預設值,ES6可以直接將預設值解除安裝引數定義的後面。

指定了預設值後,函式的length屬性會失真,此時的length屬性將返回沒有指定預設值的引數個數。

函式引數變數是預設宣告的,不能用let和const再次宣告。

使用引數預設值時,函式不能有同名引數。

通常情況下,定義了預設值的引數應該是函式的尾引數。

6.rest引數和擴充套件運算子

ES6引入了rest引數(形式為“...變數名”),用於獲取函式的多餘引數,就可以不用arguments物件了。

rest引數搭配的變數是一個數組。

rest引數只能是函式的最後一個引數。

擴充套件運算子是三個點(...),它的作用與rest相反,是將一個數組轉為用逗號隔開的引數序列。

擴充套件運算子可以展開陣列,因此不再需要使用apply將陣列轉換為函式的引數。

擴充套件運算子可用於合併陣列。

只要具有Iterator介面的物件,就都可以使用擴充套件運算子,如Map和Set,Generator函式。

7.第7中資料型別——Symbol

ES6引入了Symbol,是一種新的原始資料型別,表示獨一無二的值,也是JavaScript語言的第7種資料型別。

Symbol函式不能使用new命令,因為生成的Symbol是一個原始型別的值,不是物件,它是一種類似字串的資料型別。

Symbol值不能與其他型別的值進行運算。

相同引數的Symbol函式的返回值是不相等的。

Symbol函式的可以接受一個字串作為引數,如果引數是一個物件,就會呼叫物件的toString方法將其轉為字串,然後生成一個Symbol值。

8.Set && Map資料結構

ES6提供了新的資料結構——Set,它類似於陣列,但是成員的值都是唯一的,沒有重複。

Set本身是一個建構函式,用來生成Set資料結構。

Set的例項方法add()用於向Set結構新增成員,size返回成員數,delete()用於刪除某個值,has()用於判斷某個值是否為Set成員,clear()用於清除所有成員。

在Set內部,兩個NaN是相等的。兩個物件總是不相等的。

ES6提供了Map資料結構,它類似於物件,但是物件只接受字串作為鍵名,而Map的“鍵”可以是各種型別。

Map的鍵嚴格相等,可是為一個鍵,但NaN不嚴格相等,也將其視為一個鍵。

Map例項的size屬性返回成員數,set()方法設定key對應的value,get()方法獲取指定key的值,has()方法判斷某個鍵是否在Map中,delete()方法刪除某個鍵,clear()方法清除所有成員。

9. Promise物件

Promise是非同步程式設計的一種解決方案。

Promise兌現代表一個非同步操作,有3種狀態:Pending(進行中)、Fulfilled(已成功)、Rejected(已失敗)。

Promise的缺點:(1)無法取消。一旦新建一個Promise,它就會立即執行;(2)如果不設定回撥函式,其內部丟擲的錯誤將不會反映到外部;(3)當處於Pending狀態時,無法得知目前具體進展到哪一步。

Promise是一個建構函式,用於生成Promise例項。建構函式接收一個函式作為引數,該函式的兩個引數分別是resolve和reject,且resolve和reject分別為一個函式,由JS引擎部署。

resolve函式的作用是將Promise物件的狀態由“未完成”變為“成功”(Pending---Resolved),在非同步操作成功時呼叫。

reject函式的作用是將Promise物件的狀態由“未完成”變為“失敗”(Pending---Rejected),在非同步操作失敗是呼叫。

Promise的例項可以用then()方法接受兩個回撥函式作為引數,分別為Fulfilled和Rejected狀態的回撥函式,其中第二個引數可選。

10.for...of迴圈

ES6引入了for...of迴圈作為遍歷所有資料結構的統一方法。只要資料結構部署了Iterator屬性,就可以用for...of迴圈遍歷。

for...of可以使用的範圍:陣列,字串,Set結構,Map結構,類陣列物件,Generator物件。

11.Class(類)

ES6引入了Class關鍵字可以定義類。

類的內部定義的所有方法都是不可列舉的。

constructor方法時類的預設方法,通過new命令生成類的例項時自動呼叫該方法。

生成類的例項必須要用new關鍵字,否則會報錯。

類不存在變數提升。

如果類的方法內部有this關鍵字,它預設指向類的例項。

Class可以通過extends關鍵字實現繼承,子類必須在constructor方法中呼叫super方法,否則新建例項會報錯(因為子類沒有自己的this物件,而是繼承父類的this物件)。

12.數值的擴充套件

ES6在Number物件上提供了Number.isFinite()和Number.isNaN(),前者用於判斷是否為有限數值,後者判斷是否為非數值。

ES6將全域性parseInt()和parseFloat()移植到Number物件上,行為不變,即表示為Number.parseInt()和Number.parseFloat()。