ES6新增 深入理解generator

2022-09-02 14:18:12 字數 2949 閱讀 4319

參考學習:

先來一段最基礎的generator**

function* hello() )()

return 300

}var h = hello()

console.log(typeof h) // object

console.log(h.next()) //

console.log(h.next()) //

console.log(h.next()) //

console.log(h.next()) //

iterator遍歷器

1.symbol是乙個特殊的資料型別,和number string等並列

// 陣列

console.log([1, 2, 3][symbol.iterator]) // function values()

// 某些類似陣列的物件,noelist

console.log(document.getelementsbytagname('div')[symbol.iterator]) // function values()

2.在 es6 中,原生具有[symbol.iterator]屬性資料型別有:陣列、某些類似陣列的物件(如arguments、nodelist)、set和map。其中,set和map也是 es6 中新增的資料型別。

var item

for (item of [100, 200, 300])

// 列印出:100 200 300

// 注意,這裡每次獲取的 item 是陣列的 value,而不是 index ,這一點和 傳統 for 迴圈以及 for...in 完全不一樣

3.生成iterator物件

定義乙個陣列,然後生成陣列的iterator物件

const arr = [100, 200, 300]

const iterator = arr[symbol.iterator]() // 通過執行 [symbol.iterator] 的屬性值(函式)來返回乙個 iterator 物件

4.iterator,那麼該如何使用它呢 ———— 有兩種方式:next和for…of。

先說第一種,next

console.log(iterator.next())  // 

console.log(iterator.next()) //

console.log(iterator.next()) //

console.log(iterator.next()) //

再說第二種,for…of

let i

for (i of iterator)

// 列印:100 200 300

generator

1.generator,就是生成乙個iterator物件。因此才會有next(),也可以通過for…of來遍歷。

function* hello() )()

return 300

}const h = hello()

console.log(h[symbol.iterator]) // [function: [symbol.iterator]]

2.const h = hello()得到的就是乙個iterator物件,因為h[symbol.iterator]是有值的。既然是iterator物件,那麼就可以使用next()和for…of進行操作

console.log(h.next())  // 

console.log(h.next()) //

console.log(h.next()) //

console.log(h.next()) //

let i

for (i of h)

generator 的具體應用

next和yield引數傳遞

1.yield後面的資料被返回,存放到返回結果中的value屬性中。

function* g() 

const g = g()

console.log( g.next() ) //

2.還有另外乙個方向的引數傳遞,就是next向yield傳遞。

function* g() 

const g = g()

g.next() // value: 100, done: false

g.next('aaa') // value: 200, done: false

g.next('bbb') // value: 300, done: false

g.next('ccc') // value: undefined, done: true

3.for…of的應用示例,用簡單幾行**實現斐波那契數列。

function* fibonacci() 

}for (let n of fibonacci())

console.log(n)

}

4.yield*語句,如果有兩個generator,想要在第乙個中包含第二個,如下需求:

function* g1() 

function* g2()

function* g1() 

function* g2()

for (let item of g1())

5.generator 不是函式,更不是建構函式,建構函式返回的是this,而generator返回的是乙個iterator物件。完全是兩碼事,

深入理解ES6 解構

解構時一種打破資料結構,將其拆分為更小部分的過程。解構在實際開發中經常會應用到物件和陣列中。關於解構的基本用法,請參考 es6 變數的宣告及解構賦值 const node let node 對已經宣告的變數賦值 const node let a,b node const obj let obj co...

深入理解ES6之《解構》

如果使用var let const解析宣告變數,則必須提供初始化程式 也就是等號右側的值 以下語句有語法錯誤 var let const解構賦值表示式 也就是右側的表示式 如果為null或undefined會導致程式丟擲錯誤,因為任何嘗試讀取null或undefined的屬性的行為都會觸發執行時錯誤...

深入理解es6的promise

一 promise入門 1.promise物件是什麼 函式的另一種原生實現,比之前 函式的寫法機構清晰,功能強大,2.以前 這麼寫 function a fn else 1000 呼叫a function m 3.用promise 寫 function a else 1000 呼叫a then fu...