成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

迭代器和生成器

MorePainMoreGain / 1868人閱讀

摘要:迭代器和生成器一迭代器迭代器是帶有特殊接口的對(duì)象返回一個(gè)方法,該方法中同時(shí)又和屬性當(dāng)再?zèng)]有值可以迭代時(shí),為,為,否則為當(dāng)前值,為根據(jù)上面的描述實(shí)現(xiàn)一個(gè)迭代器,如下二生成器生成器是返回迭代器的函數(shù),如下生成器有幾點(diǎn)要注意的當(dāng)執(zhí)行流遇到語句時(shí),

迭代器和生成器 一.迭代器

1.迭代器是帶有特殊接口的對(duì)象,返回一個(gè)next方法,該方法中同時(shí)又valuedone屬性,當(dāng)再?zèng)]有值可以迭代時(shí),valueundefined,donetrue,否則value為當(dāng)前值,donefalse

2.根據(jù)上面的描述實(shí)現(xiàn)一個(gè)迭代器,如下:

let iterator = {
    i: 0,
    items: [2, 4, 6],
    next() {
        let value, done;
        done = (this.i === this.items.length);
        value = done ? undefined : this.items[this.i++];
        return {
            value: value,
            done: done
        }
    }
};
console.log(iterator.next());  //{value: 2, done: false}
console.log(iterator.next());  //{value: 4, done: false}
console.log(iterator.next());  //{value: 6, done: false}
console.log(iterator.next());  //{value: undefined, done: true}
二.生成器

1.生成器是返回迭代器的函數(shù),如下:

function *createIterator() {
    yield 1;
    yield 2;
    yield 3;
}
let iterator = createIterator();
console.log(iterator.next());  //{value: 1, done: false}
console.log(iterator.next());  //{value: 2, done: false}
console.log(iterator.next());  //{value: 3, done: false}
console.log(iterator.next());  //{value: undefined, done: true}

2.生成器有幾點(diǎn)要注意的:

當(dāng)執(zhí)行流遇到y(tǒng)ield語句時(shí),該生成器就停止運(yùn)轉(zhuǎn)了,直到迭代器再次調(diào)用next

可以再for循環(huán)中使用yield

yield只能用在生成器的內(nèi)部,即使是生成器內(nèi)部的函數(shù)也不行,即:yield無法跨越函數(shù)邊界

無法使用箭頭函數(shù)創(chuàng)建生成器

生成器可以存在于對(duì)象的屬性中

三.for-of循環(huán)

1.可迭代類型:指那些包含Symbol.iterator屬性的對(duì)象,該屬性定義了返回迭代器的函數(shù)(如:數(shù)組,set,map等)

2.for-of循環(huán)可以循環(huán)可迭代類型,for-of循環(huán)會(huì)在可迭代類型每次執(zhí)行后調(diào)用next()并將結(jié)果存儲(chǔ)在變量中,循環(huán)會(huì)持續(xù)進(jìn)行,直到結(jié)果對(duì)象的done屬性為true

3.for-of循環(huán)會(huì)調(diào)用數(shù)組的Symbol.iterator屬性來獲取迭代器(該方法由幕后的js引擎調(diào)用),并將調(diào)用iterator.next(),并將該結(jié)果對(duì)象的value屬性的值賦給num,直到done為true,循環(huán)會(huì)退出,num不會(huì)被賦給undefined,代碼如下:

let values = [1, 2, 3];
for (let item of values) {
    console.log(item);   //1 2 3
}

4.對(duì)于非可迭代對(duì)象,如nullundefined,使用for-of循環(huán)會(huì)拋出錯(cuò)誤

5.可以在for-of循環(huán)中使用解構(gòu)

let map = new Map();
map.set("name", "sxt");
map.set("age", 2);
for(let [key, value] of map) {
    console.log(key + " = " + value);
}
//輸出:
//name = sxt
//age = 2

6.for-of循環(huán)可以用于循環(huán)NodeList

四.Symbol.iterator

1.可以用Symbol.iterator屬性來訪問對(duì)象默認(rèn)的迭代器,如:

let arr = [6, 7, 8];
let iterator = arr[Symbol.iterator]();
console.log(iterator.next());  //{value: 6, done: false}
console.log(iterator.next());  //{value: 7, done: false}
console.log(iterator.next());  //{value: 8, done: false}
console.log(iterator.next());  //{value: undefined, done: true}

2.判斷一個(gè)對(duì)象是否可以迭代,可以通過判斷Symbol.iterator屬性是否是一個(gè)函數(shù)來實(shí)現(xiàn),如:

function isIterator(obj) {
    return typeof obj[Symbol.iterator] === "function";
}

let arr = [1, 3, 4];
let num = 1;
console.log(isIterator(arr)); //true
console.log(isIterator(num)); //false

3.創(chuàng)建可迭代類型: 我們自己定義的對(duì)象默認(rèn)是不可迭代類型,但是我們可以通過設(shè)置Symbol.iterator屬性來使這個(gè)對(duì)象可以迭代。因?yàn)榍懊娴?點(diǎn)有講到,判斷一個(gè)對(duì)象是否可以迭代,其實(shí)是通過Symbol.iterator屬性來確定的,由此可以創(chuàng)建下面的對(duì)象

let obj = {
    *[Symbol.iterator]() {
        yield 1;
        yield 2;
        yield 3;
    }
};
for (let item of obj) {
    console.log(item);  //1 2 3
}
五.內(nèi)置迭代器

1.我們平常迭代數(shù)組,set和map時(shí),能拿到迭代的值,是因?yàn)檫@些集合中有內(nèi)置的迭代器,如

let arr = [1, 3, 5];
let set = new Set();
set.add("time");
set.add("user");
set.add("family");
let map = new Map();
map.set("name", "sxt");
map.set("age", 12);
map.set("sister", "andy");

for(let item of arr) {
    console.log(item);  // 1 3 5
}
for(let item of set) {
    console.log(item); //time user family
}
for(let item of map) {
    console.log(item); //["name", "sxt"]  ["age", 12] ["sister", "andy"]
}

2.內(nèi)置迭代器分為三種

entries()

keys()

values()

3.數(shù)組的entries返回的是[索引,值],set的entries是[值,值],因?yàn)閟et的鍵值是一樣的,map的entries是[鍵名,鍵值],如:

let arr = [1, 3, 5];
let set = new Set();
set.add("time");
set.add("user");
set.add("family");
let map = new Map();
map.set("name", "sxt");
map.set("age", 12);
map.set("sister", "andy");

for(let item of arr.entries()) {
    console.log(item);  // [0, 1]  [1, 3]  [2, 5]
}
for(let item of set.entries()) {
    console.log(item); //["time", "time"]  ["user", "user"] ["family", "family"]
}
for(let item of map.entries()) {
    console.log(item); //["name", "sxt"]  ["age", 12] ["sister", "andy"]
}

4.數(shù)組的keys返回的索引,set的keys返回的還是值,map的keys返回的是值
5.數(shù)組,set,map的values返回的都是值

六.向迭代器中傳遞參數(shù)

1.我們可以向迭代器中傳遞參數(shù)

function *createIterator() {
    let first = yield 1;
    let second = yield first + 2;
    yield second + 3;
}

let iterator = createIterator();
console.log(iterator.next());   //{value: 1, done: false}
console.log(iterator.next(4));  //{value: 6, done: false}
console.log(iterator.next(5));  //{value: 8, done: false}
console.log(iterator.next());   //{value: undefined, done: true}

這里的難點(diǎn)是理解右側(cè)的代碼會(huì)和左邊的中斷

首次調(diào)用next的時(shí)候,不管傳入什么參數(shù)都會(huì)被忽略,因?yàn)閭魅氲膮?shù)會(huì)作為yield語句的返回值,而第一次只是yield 1,而沒有變量

七.包含return語句的生成器
function *createIterator() {
    yield 1;
    return 133;
    yield 2;
    yield 3;
}

let iterator = createIterator();
console.log(iterator.next());   //{value: 1, done: false}
console.log(iterator.next(4));  //{value: 133, done: true}
console.log(iterator.next(5));  //{value: undefined, done: true}
console.log(iterator.next());   //{value: undefined, done: true}

return會(huì)讓它提前執(zhí)行完畢并針對(duì)next的調(diào)用返回一個(gè)值

八.生成器代理

1.即,在一個(gè)生成器中調(diào)用另外的生成器,有時(shí)候,這樣的操作會(huì)更加的實(shí)用

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

function *create() {
    yield *create1();
    yield true;
}


let iterator = create();
console.log(iterator.next());  //{value: 1, done: false}
console.log(iterator.next());  //{value: 2, done: false}
console.log(iterator.next());  //{value: 3, done: false}
console.log(iterator.next());  //{value: true, done: false}
console.log(iterator.next());  //{value: undefined, done: true}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96201.html

相關(guān)文章

  • ES6-迭代器(iterator)和成器(generator) - 什么是迭代器和成器

    摘要:我個(gè)人認(rèn)為迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會(huì)寫關(guān)于二者的一系列文章。 我個(gè)人認(rèn)為迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會(huì)寫關(guān)于二者的一系列文章。話不多說,先來了解一下基本概念:一:什么是迭代器 1: 迭代器是一個(gè)對(duì)象 2: 迭代器有一個(gè)屬性...

    CollinPeng 評(píng)論0 收藏0
  • PHP的迭代器和成器

    摘要:生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置缺點(diǎn)生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵?,生成器永遠(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無法后退或前進(jìn)。 一.迭代器 分析:想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背單一職責(zé)原則,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開,兩者可獨(dú)立發(fā)展...

    sanyang 評(píng)論0 收藏0
  • python奇遇記:迭代器和成器

    摘要:來說說迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。有點(diǎn)繞是不是,其實(shí),一般只要知道可迭代對(duì)象以及它是如何實(shí)現(xiàn)的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。 之前簡(jiǎn)單的提到過,一個(gè)對(duì)象是可迭代的可以理解為能夠使用for循環(huán)。這樣說其實(shí)不太準(zhǔn)確,某個(gè)對(duì)象可迭代是因?yàn)樗鼉?nèi)部實(shí)現(xiàn)了$__iter__$這個(gè)特殊方法。比如在...

    atinosun 評(píng)論0 收藏0
  • Python中的可迭代的對(duì)象、迭代器和成器

    摘要:本文重點(diǎn)掌握可迭代的對(duì)象的定義掌握可迭代對(duì)象迭代器與生成器之間的關(guān)系和異同熟悉標(biāo)準(zhǔn)庫中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對(duì)象。若想再次迭代須重建迭代器。迭代器檢查方式調(diào)用,。區(qū)別可迭代的對(duì)象不是迭代器。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握可迭代的對(duì)象的...

    starsfun 評(píng)論0 收藏0
  • Python基礎(chǔ)-迭代器和成器

    摘要:迭代器迭代器用于循環(huán)構(gòu)建和擴(kuò)展集合類型逐行遍歷文本文件列表推導(dǎo)字典推導(dǎo)和集合推導(dǎo)元組拆包調(diào)用函數(shù)時(shí),使用拆包實(shí)參解釋器需要迭代對(duì)象時(shí),會(huì)自動(dòng)調(diào)用內(nèi)置的函數(shù),有以下功能檢查對(duì)象是否實(shí)現(xiàn)了方法,如果實(shí)現(xiàn)了就調(diào)用它,獲取一個(gè)迭代器。 迭代器 迭代器用于: for 循環(huán) 構(gòu)建和擴(kuò)展集合類型 逐行遍歷文本文件 列表推導(dǎo)、 字典推導(dǎo)和集合推導(dǎo) 元組拆包 調(diào)用函數(shù)時(shí), 使用 * 拆包實(shí)參 解釋器...

    objc94 評(píng)論0 收藏0
  • ES6-迭代器(iterator)和成器(generator)- 迭代器和成器的高級(jí)用法

    摘要:在生成器中使用語句生成器也是函數(shù),所以它也可以使用語句。只是由于生成器本身的特性,其內(nèi)部的的行為會(huì)和一般函數(shù)有些差別。 前面2篇系列文章講解了迭代器和生成器的最常用,最基礎(chǔ)的用法;這篇來討論迭代器和生成器的一些稍稍高級(jí)一點(diǎn)的用法: 1: 給迭代器的next()方法傳參 2: 從迭代器中拋出錯(cuò)誤 3: 在生成器中使用return語句 4: 委托生成器(組合生成器或者生成器組合?) 1: ...

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

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

0條評(píng)論

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