国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從iterator到generator

mmy123456 / 764人閱讀

摘要:迭代器協(xié)議當(dāng)一個(gè)對(duì)象被認(rèn)為是一個(gè)迭代器時(shí),它實(shí)現(xiàn)了一個(gè)的方法。該方法返回一個(gè)對(duì)象包含和屬性,的值表示迭代器是否可以產(chǎn)生序列中的下一個(gè)值,為迭代器返回的任何值。

iterator 可遍歷(可迭代)協(xié)議

一個(gè)對(duì)象為了變成可遍歷對(duì)象,比如說可以用 for ... in 結(jié)構(gòu)遍歷其屬性值,必須實(shí)現(xiàn) @@iterator 方法, 意思是這個(gè)對(duì)象(或者它原型鏈 prototype chain 上的某個(gè)對(duì)象)必須有一個(gè)名字是 Symbol.iterator 的屬性。

屬性
[Symbol.iterator] 返回一個(gè)對(duì)象的無參函數(shù),被返回對(duì)象符合可遍歷協(xié)議。
迭代器協(xié)議

當(dāng)一個(gè)對(duì)象被認(rèn)為是一個(gè)迭代器時(shí),它實(shí)現(xiàn)了一個(gè) next() 的方法。
該方法返回一個(gè)對(duì)象包含 donevalue 屬性,done 的值表示迭代器是否可以產(chǎn)生序列中的下一個(gè)值,value 為迭代器返回的任何 JavaScript 值。donetrue 時(shí)可省略。

let a = {
    q: "q",
    w: "w",
    e: "e",
};
Object.defineProperty(a, length, {
    enumerable: false,
    value: 3
});

現(xiàn)在對(duì) a 嘗試用 for ... in 結(jié)構(gòu)遍歷其屬性值

for (let v of a) {
    console.log(v);
}

報(bào)錯(cuò):

Uncaught TypeError: a[Symbol.iterator] is not a function

定義一個(gè)函數(shù)利用閉包實(shí)現(xiàn)一個(gè)將 a 轉(zhuǎn)變?yōu)榭傻鷮?duì)象

function Iterator(obj) {
    let i;

    return ()=> {
        return {
            next: ()=> {
                if (i < obj.length) {
                    for (i in obj) {
                        return {
                            done: false,
                            value: obj[i]
                        };
                    }
                }
                return {
                    done: true
                };
            }
        };
    };
}

a[Symbol.iterator] = Iterator(a);
generator

Generator 函數(shù)最大特點(diǎn)就是可以交出函數(shù)的執(zhí)行權(quán)(即暫停執(zhí)行)。異步操作需要暫停的地方,都用 yield 語句注明。調(diào)用 Generator 函數(shù)并不會(huì)執(zhí)行本體,而是每次調(diào)用 next 方法的時(shí)候,執(zhí)行到下一個(gè)碰到的 yield 處。

Generator 函數(shù)的數(shù)據(jù)交換
function* anotherGenerator(i) {
  yield i + 1;
  let x = yield i + 2;
  yield x + 3;
}

function* generator(i){
  yield i;
  yield* anotherGenerator(i);
  // 執(zhí)行權(quán)轉(zhuǎn)交給另一個(gè) generator 函數(shù)的話 yield 后面帶星號(hào),直接調(diào)用的話是沒有效果的
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next(2).value); // 5
console.log(gen.next().value); // 20
// next 的返回值和迭代器的 next 類似,yield 語句的執(zhí)行結(jié)果作為 value,是否還有下一個(gè) yield 決定 done
// next 方法可以帶有參數(shù),這個(gè)參數(shù)可以傳入 Generator 函數(shù),作為上個(gè)階段異步任務(wù)的返回結(jié)果
Generator 函數(shù)的錯(cuò)誤處理

Generator 函數(shù)內(nèi)部還可以部署錯(cuò)誤處理代碼,捕獲函數(shù)體外拋出的錯(cuò)誤。

function* gen(x){
  try {
    var y = yield x + 2;
  } catch (e){ 
    console.log(e);
  }
  return y;
}

var g = gen(1);
g.next();
g.throw("出錯(cuò)了");
// 出錯(cuò)了

上面代碼的最后一行,Generator 函數(shù)體外,使用指針對(duì)象的 throw 方法拋出的錯(cuò)誤,可以被函數(shù)體內(nèi)的 try ... catch

Generator 函數(shù)的終止

Generator函數(shù)返回的遍歷器對(duì)象,還有一個(gè)return方法,可以返回給定的值,并且終結(jié)遍歷Generator函數(shù)。

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

var g = gen();

g.next()        // { value: 1, done: false }
g.return("foo") // { value: "foo", done: true }
g.next()        // { value: undefined, done: true }

如果Generator函數(shù)內(nèi)部有try...finally代碼塊,那么return方法會(huì)推遲到finally代碼塊執(zhí)行完再執(zhí)行。

function* numbers () {
  yield 1;
  try {
    yield 2;
    yield 3;
  } finally {
    yield 4;
    yield 5;
  }
  yield 6;
}
var g = numbers()
g.next() // { done: false, value: 1 }
g.next() // { done: false, value: 2 }
g.return(7) // { done: false, value: 4 }
g.next() // { done: false, value: 5 }
g.next() // { done: true, value: 7 }

上面代碼中,調(diào)用return方法后,就開始執(zhí)行finally代碼塊,然后等到finally代碼塊執(zhí)行完,再執(zhí)行return方法。

Generator 函數(shù)的自動(dòng)執(zhí)行

co 庫是tj寫的一個(gè)讓Generator函數(shù)自動(dòng)執(zhí)行的工具。

let co = require("co");
let p = co(gen);

p.then(function (){
  console.log("ok");
})

co 函數(shù)返回一個(gè) Promise 對(duì)象,因此可以用 then 方法添加回調(diào)函數(shù)。

async 與 await

ES7 為 generator 的語法糖

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87777.html

相關(guān)文章

  • [前端漫談_1] for of 聊 Generator

    摘要:數(shù)據(jù)的層級(jí)意味著迭代數(shù)據(jù)結(jié)構(gòu)并提取它的數(shù)據(jù)。對(duì)于技術(shù)人而言技是單兵作戰(zhàn)能力,術(shù)則是運(yùn)用能力的方法。在前端娛樂圈,我想成為一名出色的人民藝術(shù)家。 聊聊 for of 說起 for of 相信每個(gè)寫過 JavaScript 的人都用過 for of ,平時(shí)我們用它做什么呢?大多數(shù)情況應(yīng)該就是遍歷數(shù)組了,當(dāng)然,更多時(shí)候,我們也會(huì)用 map() 或者 filer() 來遍歷一個(gè)數(shù)組。 但是就...

    miqt 評(píng)論0 收藏0
  • es6 generator函數(shù)

    摘要:返回的遍歷器對(duì)象可以依次遍歷函數(shù)內(nèi)部的每一個(gè)狀態(tài)。示例內(nèi)部捕獲外部捕獲內(nèi)部捕獲外部捕獲上面代碼遍歷器對(duì)象連續(xù)拋出兩個(gè)錯(cuò)誤,第一個(gè)被函數(shù)體內(nèi)的捕獲。上面代碼中,首先執(zhí)行函數(shù),獲取遍歷器對(duì)象,然后使用方法第二行,執(zhí)行異步任務(wù)的第一階段。 參考 來源《ecmascript6 入門》generator部分 認(rèn)識(shí)generator函數(shù) 形式上,generator函數(shù)有兩個(gè)特點(diǎn):一是functio...

    voidking 評(píng)論0 收藏0
  • ES6之IteratorGenerator

    摘要:舉個(gè)例子遍歷器生成函數(shù),作用就是返回一個(gè)遍歷器對(duì)象,方法返回一個(gè)對(duì)象,表示當(dāng)前數(shù)據(jù)成員的信息。該對(duì)象本身也具有屬性,執(zhí)行后返回自身。 Iterator的作用 一是為各種數(shù)據(jù)結(jié)構(gòu),提供一個(gè)統(tǒng)一的、簡便的訪問接口;(統(tǒng)一)二是使得數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種次序排列;(按序)三是ES6創(chuàng)造了一種新的遍歷命令for...of循環(huán),Iterator接口主要供for...of消費(fèi)。舉個(gè)例子:遍歷器生...

    tuomao 評(píng)論0 收藏0
  • ES6之IteratorGenerator

    摘要:舉個(gè)例子遍歷器生成函數(shù),作用就是返回一個(gè)遍歷器對(duì)象,方法返回一個(gè)對(duì)象,表示當(dāng)前數(shù)據(jù)成員的信息。該對(duì)象本身也具有屬性,執(zhí)行后返回自身。 Iterator的作用 一是為各種數(shù)據(jù)結(jié)構(gòu),提供一個(gè)統(tǒng)一的、簡便的訪問接口;(統(tǒng)一)二是使得數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種次序排列;(按序)三是ES6創(chuàng)造了一種新的遍歷命令for...of循環(huán),Iterator接口主要供for...of消費(fèi)。舉個(gè)例子:遍歷器生...

    ashe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<