ES6 新內容(二)Proxy和Iterator

2021-09-28 23:36:37 字數 2646 閱讀 5446

1.proxy和reflect攔截

2.iterator遍歷器

proxy**,攔截作用。

var proxy = new proxy(target, handler);
proxy.revocable方法返回乙個可取消的proxy例項。

在 proxy **的情況下,目標物件內部的this關鍵字會指向 proxy **。

修改了object的一些方法,改為函式呼叫,返回布林值更為合理,為proxy操作物件的事件提供便利。

同proxy的handler支援的事件一致。

(1)建立乙個指標物件,指向當前資料結構的起始位置。也就是說,遍歷器物件本質上,就是乙個指標物件

(2)第一次呼叫指標物件的next方法,可以將指標指向資料結構的第乙個成員。

(3)第二次呼叫指標物件的next方法,指標就指向資料結構的第二個成員。

(4)不斷呼叫指標物件的next方法,直到它指向資料結構的結束位置。

每一次呼叫next方法,都會返回資料結構的當前成員的資訊。

乙個資料結構只要具有symbol.iterator屬性,就可以認為是「可遍歷的」(iterable)。

遍歷器物件的根本特徵就是具有next方法。每次呼叫next方法,都會返回乙個代表當前成員的資訊物件,具有value和done兩個屬性。

舉例:

const obj = ;}};

}};

1)解構賦值

對陣列和set結構進行解構賦值時,會預設呼叫symbol.iterator方法。

let set = new set().add('a').add('b').add('c');

let [x,y] = set;

// x='a'; y='b'

let [first, ...rest] = set;

// first='a'; rest=['b','c'];

2)擴充套件運算子

3)yield*

4)其他場合

由於陣列的遍歷會呼叫遍歷器介面,所以任何接受陣列作為引數的場合,其實都呼叫了遍歷器介面。

是es6提供的一種非同步程式設計解決方案,語法行為與傳統函式完全不同。

返回乙個狀態物件

function

*helloworldgenerator()

var hw =

helloworldgenerator()

;hw.

next()

;//

執行邏輯:

(1)遇到yield語句,就暫停執行後面的操作,並將緊跟在yield後面的那個表示式的值,作為返回的物件的value屬性值。

(2)下一次呼叫next方法時,再繼續往下執行,直到遇到下乙個yield語句。

(3)如果沒有再遇到新的yield語句,就一直執行到函式結束,直到return語句為止,並將return語句後面的表示式的值,作為返回的物件的value屬性值。

(4)如果該函式沒有return語句,則返回的物件的value屬性值為undefined。

注意:

foo

(yield

'a',

yield

'b')

;// ok

let input =

yield

;// ok

如果在generater函式內部,呼叫另乙個generator函式,預設情況下是沒有效果的。

這個就需要用到yield*語句,用來在乙個generator函式裡面執行另乙個generator函式。

function

*foo()

function

*bar()

// 等同於

function

*bar()

function

*gen()

gen().

next()

//

yield命令後面如果不加星號,返回的是整個陣列,加了星號就表示返回的是陣列的遍歷器物件。

iterator物件最重要的symbol.iterator屬性,就是呼叫next()方法遍歷陣列中下乙個物件,並返回遍歷器物件。這可以通過generator函式實現。

可以把generator賦值給物件的symbol.iterator屬性,從而使得該物件具有iterator介面。

yield句本身沒有返回值,或者說總是返回undefined。next方法可以帶乙個引數,該引數就會被當作上乙個yield語句的返回值。

throw

在函式體外丟擲錯誤,然後在generator函式體內捕獲。

return

可以返回給定的值,並且終結遍歷generator函式。

返回的總是遍歷器物件,而不是this物件。

generator函式也不能跟new命令一起用,會報錯。

generator是實現狀態機的最佳結構。

可以理解成「協作的執行緒」或「協作的函式」。協程既可以用單執行緒實現,也可以用多執行緒實現。

從實現上看,在記憶體中,子例程只使用乙個棧(stack),而協程是同時存在多個棧,但只有乙個棧是在執行狀態,也就是說,協程是以多占用記憶體為代價,實現多工的並行。

ES6新特性 二

二 變數的解構賦值 2.1 陣列的解構賦值 陣列的元素是按次序排列的,變數的取值由它的位置決定 let a,b,c 1,2,3 等價於 let a 1 let b 2 let c 3 2.2物件的解構賦值 let 物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值 2.3 字串解構賦值 con...

es6新特性 ES6新特性(一)

var 1 var宣告的是函式作用域 區域性 但在if for等定義的變數是全域性的 2 var 具有變數提公升,預解析 3 在同乙個作用域下,var可以宣告多次 4 var 宣告的變數會掛載到window上 let1 let不存在變數提公升,在變數使用之前,必須要先宣告 2 let在同一作用域下,...

ES6 中的Reflect和Proxy簡單介紹

proxy 與 reflect 是 es6 為了操作物件引入的 api reflect 可以用於獲取目標物件的行為,它與 object 類似,但是更易讀,為操作物件提供了一種更優雅的方式,函式式程式設計。它的方法與 proxy 是對應的。const obj reflect api方法1.refect...