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...