【考前必看二】面試前夕知識點梳理之ES6

二、ES6

1. let、const 和 var

  • let 和 const 定義的變量不會出現變量提升,而 var 定義的變量會提升。
  • let 和 const 會出現暫時性死區,而 var 不會出現暫時性死區。
  • 在相同作用域中,let 和 const 不允許重複聲明,var 允許重複聲明。
  • let 和 const 在塊級作用域內有效,而 var 在全局作用域有效。
  • const 聲明變量時必須設置初始值
  • const 聲明一個只讀的常量,這個常量不可改變。如果它是一個複雜數據類型,那麼只是指針常量指向的堆地址不變,堆地址中的內容仍然可變

2. 箭頭函數

箭頭函數的使用注意點:

(1)箭頭函數中沒有 this 對象

  • 箭頭函數中的 this 對象,就是定義時所在的對象,而不是使用時所在的對象。
  • 箭頭函數中 this 對象指向是固定的,這種特性有利於封裝回調函數

(2)箭頭函數中沒有 arguments 對象

  • 箭頭函數可以使用 rest 參數來代替。

(3)箭頭函數中沒有 arguments、super、new.target 這三個變量。

  • 箭頭函數中的這三個變量,指向的其實是外層函數對應的變量。

(4)箭頭函數不可以使用 call()、apply()、bind() 這些方法去改變 this 的指向。因爲箭頭函數沒有自己的 this。

(5)箭頭函數不可以使用 yield 命令。因此箭頭函數不能用作 Generator 函數,也就是說,不可以使用 new 命令,否則會拋出一個錯誤。

箭頭函數不適用的場合:

(1)第一個場合是定義對象的方法,且該方法內部包括 this

(2)第二個場合是需要動態 this 的時候,也不應使用箭頭函數。

3. Promise對象

Promise 對象的含義

(1)Promise 對象是異步編程的一種解決方案。

(2)Promise 對象的兩個特點:

  • 對象的狀態不受外界影響。Promise 對象有三種狀態:pending(進行中)、fulfilled(已成功)和 rejected(已失敗)
  • 對象的狀態一旦改變,就不會再變,任何時候都可以得到這個結果。Promise 對象的狀態改變,只有兩種可能:從 pending變爲 fulfilled 和從 pending 變爲 rejected

(3)Promise 對象的優點:

  • Promise 對象,可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。
  • Promise 對象提供了統一的接口,各種異步操作都可以用同樣的方法進行處理,使得控制異步操作更加容易。

(4)Promise 對象的缺點:

  • 無法取消 Promise,一旦新建它就會立即執行,無法中途取消。
  • 如果不設置回調函數,Promise 內部拋出的錯誤,不會反應到外部。
  • 當處於 pending 狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。

Promise 對象的基本用法

   ES6 規定,Promise 對象是一個構造函數,用來生成 Promise 實例。

   在創建 Promise 實例時,Promise 構造函數接受一個函數作爲參數,該函數的兩個參數分別是 resolve 和 reject。     

   Promise 實例生成以後,可以用 then 方法分別指定 resolved 狀態和 rejected 狀態的回調函數。其中,第二個函數是可選的。

(1)resolve 函數和 reject 函數的作用

  • resolve 函數的作用:將 Promise 對象的狀態從“未完成”變爲“成功”(即從 pending 變爲 resolved),在異步操作成功時調用,並將異步操作的結果,作爲參數傳遞出去。
  • reject 函數的作用:將 Promise 對象的狀態從“未完成”變爲“失敗”(即從 pending 變爲 rejected),在異步操作失敗時調用,並將異步操作報出的錯誤,作爲參數傳遞出去。

(2)resolve 函數和 reject 函數的參數

   如果調用 resolve 函數和 reject 函數時帶有參數,那麼它們的參數會被傳遞給回調函數。

  • reject 函數的參數通常是Error對象的實例,表示拋出的錯誤
  • resolve 函數的參數除了正常的值以外,還可能是另一個 Promise 實例

(3)resolve 函數和 reject 函數的注意點

   調用 resolve 或 reject 並不會終結 Promise 的參數函數的執行,最好在它們前面加上 return 語句

Promise 對象的方法

(1)Promise.prototype.then() 

  • then 方法的第一個參數是 resolved 狀態的回調函數,第二個參數(可選)是 rejected 狀態的回調函數。
  • then 方法返回的是一個新的 Promise 實例(注意,不是原來那個 Promise 實例)。因此可以採用鏈式寫法,即 then 方法後面再調用另一個 then 方法。

(2)Promise.prototype.catch() 

   catch 方法是 .then(null,rejection) 或 .then(undefined,rejection) 的別名,用於指定發生錯誤時的回調函數。

  • 如果異步操作拋出錯誤,狀態就會變爲 rejected,就會調用 catch 方法指定的回調函數,處理這個錯誤。另外,then 方法指定的回調函數,如果運行中拋出錯誤,也會被 catch 方法捕獲。
  • 如果 Promise 狀態已經變成 resolved,再拋出錯誤無效的。
  • Promise 對象的錯誤具有“冒泡”性質
  • 一般來說,不要在 then 方法裏面定義 Reject 狀態的回調函數(即 then 的第二個參數),總是使用 catch 方法
  • 如果沒有使用 catch 方法指定錯誤處理的回調函數,Promise 對象拋出的錯誤不會傳遞到外層代碼,即不會有任何反應。
  • catch 方法返回的還是一個 Promise 對象,因此後面還可以接着調用 then 方法
  • catch 方法之中,還能再拋出錯誤。此時,可以再在後面加一個 catch 方法,用來捕獲前一個catch 方法拋出的錯誤。

(3)Promise.prototype.finally()

   finally 方法用於指定不管 Promise 對象最後狀態如何,都會執行的操作。

  • 這表明,finally 方法裏面的操作,與狀態無關,不依賴於 Promise 的執行結果。
  • finally 本質上是 then 方法的特例
  • finally 方法總是會返回原來的值

(4)Promise.all()

   Promise.all 方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例。

  • Promise.all 方法接受一個數組作爲參數,如果不是數組,但必須具有 Iterator 接口,且返回的每個成員都是 Promise 實例
  • 新的 Promise 實例 p 的狀態由 p1p2p3決定,分成兩種情況:只有 p1p2p3的狀態都變成 fulfilled,p 的狀態纔會變成 fulfilled,此時 p1p2p3的返回值組成一個數組,傳遞給 p 的回調函數。只要 p1p2p3之中有一個被 rejected,p 的狀態就變成 rejected,此時第一個被 reject 的實例的返回值,會傳遞給 p 的回調函數。
  • 如果作爲參數的 Promise 實例,自己定義了 catch 方法,那麼它一旦被 rejected,並不會觸發 Promise.all() 的 catch 方法。如果 p2沒有自己的 catch 方法,就會調用 Promise.all() 的 catch 方法。

(5)Promise.race() 

 Promise.race 方法與 Promise.all 方法基本相同,唯一的區別在於:

  • 只要 p1p2p3之中有一個實例率先改變狀態,p 的狀態就跟着改變。那個率先改變的 Promise 實例的返回值,就傳遞給p 的回調函數。(Promise.all 方法則必須等所有的狀態都發生改變,纔會將所有的返回值一起傳遞給回調函數。)

(6)Promise.resolve()

 有時需要將現有對象轉爲 Promise 對象,Promise.resolve 方法就起到這個作用。

 Promise.resolve 方法的參數分成四種情況。

  • 參數是一個 Promise 實例:原封不動地返回這個實例。
  • 參數是一個 thenable 對象( thenable 對象指的是具有 then 方法的對象):Promise.resolve 方法會將這個對象轉爲 Promise 對象,然後就立即執行 thenable 對象的 then 方法。
  • 參數不是具有 then 方法的對象,或根本就不是對象:如果參數是一個原始值,或者是一個不具有 then 方法的對象,則Promise.resolve 方法返回一個新的 Promise 對象,狀態爲 resolved,並會立即執行回調函數。
  • 不帶有任何參數:直接返回一個 resolved 狀態的 Promise 對象。

(7)Promise.reject()

  • Promise.reject(reason) 方法也會返回一個新的 Promise 實例,該實例的狀態爲 rejected。
  • Promise.reject() 方法的參數,會原封不動地作爲 reject 的理由,變成後續方法的參數。這一點與 Promise.resolve 方法不一致。

(8)Promise.try()

   Promise.try 方法可以讓同步函數同步執行,異步函數異步執行,並且讓它們具有統一的 API。

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章