成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

ES6 之 Iterator&Generator

xietao3 / 1692人閱讀

摘要:可迭代對(duì)象就具有屬性,它是一種與迭代器密切相關(guān)的對(duì)象。它通過(guò)指定的函數(shù)可以返回一個(gè)作用于附屬對(duì)象的迭代器。迭代器特點(diǎn)每次調(diào)用方法時(shí),返回一個(gè)數(shù)組,數(shù)組中兩個(gè)元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點(diǎn)返回集合中存在的每一個(gè)鍵。

Iterator由來(lái)

不推薦Iterator方法。 Iterator 函數(shù)是一個(gè) SpiderMonkey 專(zhuān)有特性,并且會(huì)在某一時(shí)刻被刪除。
有一點(diǎn),需要清楚的,就是“迭代協(xié)議”。迭代協(xié)議MDN說(shuō)明

// 簡(jiǎn)單示例,摘自“深入理解ES6”
function createIterator(items) {
    let i = 0;
    
    return {
        next: function() {
            let done = (i >= items.length);
            let value = !done ? items[i++] : undefined;
            
            return {
                done,
                value
            }
        }
    }
}
let iterator = createIterator([1, 2, 3]);

console.log(iterator.next()); // { done: false, value: 1 }
console.log(iterator.next()); // { done: false, value: 2 }
console.log(iterator.next()); // { done: false, value: 3 }
console.log(iterator.next()); // { done: true, value: undefined }
// 之后所有的調(diào)用都會(huì)返回相同的內(nèi)容
console.log(iterator.next()); // { done: true, value: undefined }
Generator定義

生成器是一種返回迭代器的函數(shù),通過(guò)function關(guān)鍵字后的星號(hào)(*)來(lái)表示,函數(shù)中會(huì)用到新的關(guān)鍵字yield。星號(hào)可以緊挨著function關(guān)鍵字,也可以在中間加一個(gè)空格。

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 }

// 換個(gè)方法
function *createIterator(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}

let iterator = createIterator([1, 2, 3]);
// iterator 與前面代碼創(chuàng)建的 iterator 功能一樣,可以試一下。
yield的使用限制
yield關(guān)鍵字只能在生成器內(nèi)部使用,在其他地方使用會(huì)導(dǎo)致程序拋出語(yǔ)法錯(cuò)誤,即便在生成器的函數(shù)里使用也如此。
function *createIterator(items) {
    items.forEach(function(item) {
        yield item + 1;
    });
}
// 會(huì)報(bào)語(yǔ)法錯(cuò)誤 node ./iterator.js

從字面理解,yield關(guān)鍵字確定在createIterator()函數(shù)內(nèi)部,但是它與return關(guān)鍵字一樣,二者都不能穿透函數(shù)邊界。嵌套函數(shù)中的return語(yǔ)句不能用作函數(shù)的返回語(yǔ)句,而此處嵌套函數(shù)中的yield語(yǔ)句會(huì)導(dǎo)致程序拋出語(yǔ)法錯(cuò)誤。
生成器函數(shù)表達(dá)式&對(duì)象方法
通過(guò)上面的方法,關(guān)于函數(shù)表達(dá)式和對(duì)象方法,直接上代碼吧,更明白。

// 函數(shù)表達(dá)式
let createIterator = function *(items) {
    for (let i =0; i < items.length; i++) {
        yield items[i];
    }
}

let iterator = createIterator([1, 2, 3]);

// 對(duì)象方法
let o = {
    createIterator: function *(items) {
        yield items[i];
    }
}

let iterator = o.createIterator([1, 2, 3]);
可迭代對(duì)象 & for-of 循環(huán)

看過(guò)Symbol文章的小伙伴應(yīng)該都知道,Symbol.iterator就是 well-known Symbol之一??傻鷮?duì)象就具有Symbol.iterator屬性,它是一種與迭代器密切相關(guān)的對(duì)象。它通過(guò)指定的函數(shù)可以返回一個(gè)作用于附屬對(duì)象的迭代器。在ES6中,所有的集合對(duì)象(Array, Set, Map)和字符串都是可迭代對(duì)象,這些對(duì)象中都有默認(rèn)的迭代器。當(dāng)然,ES中也添加了for-of循環(huán)這些可迭代對(duì)象。

迭代器

for-of循環(huán)

這是解決循環(huán)內(nèi)部索引跟蹤問(wèn)題的關(guān)鍵工具。
for-of循環(huán)每執(zhí)行一次都會(huì)調(diào)用可迭代對(duì)象中的next()方法,并將迭代器返回的結(jié)果對(duì)象的value屬性存儲(chǔ)在一個(gè)變量中,循環(huán)將持續(xù)執(zhí)行這一過(guò)程直到返回對(duì)象的done屬性為true。

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

示例說(shuō)明:
for-of循環(huán)的代碼通過(guò)調(diào)用values數(shù)組的Symbol.iterator方法來(lái)獲取迭代器,這一過(guò)程是在Javascript引擎背后完成的。隨后迭代器的next()的方法被多次調(diào)用,從其返回對(duì)象的value屬性讀取值并存儲(chǔ)在變量num中,直到對(duì)象的done為true時(shí)循環(huán)退出,所以num不會(huì)賦值為undefined

訪(fǎng)問(wèn)默認(rèn)迭代器

從上面的例子可以看出,可迭代對(duì)象都有一個(gè)默認(rèn)迭代器。這個(gè)迭代器可通過(guò)Symbol.iterator來(lái)訪(fǎng)問(wèn)。

let values = [1, 2, 3];
let iterator = values[Symbol.iterator]();
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 }

由此,我們可以判斷對(duì)象是否可迭代,是不是有更好的方法?

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

console.log(isIterator([1, 2, 3]));  // true
console.log(isIterator("Hello"));  // true
console.log(isIterator(new Map()));  // true
console.log(isIterator(new Set()));  // true
console.log(isIterator(new WeakMap()));  // false
console.log(isIterator(new WeakSet()));  // false
創(chuàng)建可迭代對(duì)象

默認(rèn)情況下,開(kāi)發(fā)者定義的對(duì)象都是不可迭代的對(duì)象,但如果給Symbol.iterator屬性添加一個(gè)生成器,則可以將其變?yōu)榭傻鷮?duì)象。

let collection = {
    items: [],
    *[Symbol.iterator]() {
        for (let item of this.items) {
            yield item;
        }
    }
};

collection.items.push(1);
collection.items.push(2);
collection.items.push(3);

for (let item of collection){
    console.log(item);
}
// 輸出:
// 1
// 2
// 3
內(nèi)建迭代器

到這里,應(yīng)該明白,ES6中已經(jīng)默認(rèn)為很多內(nèi)建類(lèi)型提供了內(nèi)建迭代器,只有這些內(nèi)容無(wú)法實(shí)現(xiàn)目標(biāo)時(shí),才需要自己創(chuàng)建。ES6中有三種集合對(duì)象: 數(shù)組、Map與Set集合,他們內(nèi)建了以下三種迭代器:

entries() 返回值為多個(gè)鍵值對(duì)迭代器

values() 返回值為集合的迭代器

keys() 返回集合中所有鍵名迭代器

MDN 關(guān)于內(nèi)建迭代器 說(shuō)的比較簡(jiǎn)單,我就按“深入理解ES6”來(lái)詳細(xì)說(shuō)一下吧。

entries() 迭代器

特點(diǎn):每次調(diào)用next()方法時(shí),entries()返回一個(gè)數(shù)組,數(shù)組中兩個(gè)元素,分別表示鍵和值。

- Array 第一個(gè)元素為數(shù)字類(lèi)型的索引,第二個(gè)元素為值
- Set 第一個(gè)元素與第二個(gè)元素都是值,因?yàn)镾et中值也作為鍵來(lái)使用
- Map 第一個(gè)元素為鍵,第二個(gè)元素為值
示例:
let colors = [ "red", "green", "blue"];
let tracking = new Set([ 123, 456, 890]);
let data = new Map();
data.set("title", "ES6之Iterator&Generator");
data.set("formate", "net share");

for (let entry of colors.entries()) {
    console.log(entry);
}
// 輸出:
// [ 0, "red" ]
// [ 1, "green" ]
// [ 2, "blue" ]

for (let entry of tracking.entries()) {
    console.log(entry);
}
// 輸出:
// [ 123, 123 ]
// [ 456, 456 ]
// [ 890, 890 ]

for (let entry of data.entries()) {
    console.log(entry);
}
// 輸出:
// [ "title", "ES6之Iterator&Generator" ]
// [ "formate", "net share" ]
values() 迭代器

特點(diǎn): 返回集合中所存的所有值。
示例:

let colors = [ "red", "green", "blue"];
let tracking = new Set([ 123, 456, 890]);
let data = new Map();
data.set("title", "ES6之Iterator&Generator");
data.set("formate", "net share");

for (let entry of colors.values()) {
    console.log(entry);
}
// 輸出:
// red
// green
// blue

for (let entry of tracking.values()) {
    console.log(entry);
}
// 輸出:
// 123
// 456 
// 890 

for (let entry of data.values()) {
    console.log(entry);
}
// 輸出:
// ES6之Iterator&Generator
// net share
keys() 迭代器

特點(diǎn):返回集合中存在的每一個(gè)鍵。
示例:

    let colors = [ "red", "green", "blue"];
    let tracking = new Set([ 123, 456, 890]);
    let data = new Map();
    data.set("title", "ES6之Iterator&Generator");
    data.set("formate", "net share");
    
    for (let entry of colors.keys()) {
        console.log(entry);
    }
    // 輸出:
    // 0
    // 1
    // 2
    
    for (let entry of tracking.keys()) {
        console.log(entry);
    }
    // 輸出:
    // 123
    // 456
    // 890
    
    for (let entry of data.keys()) {
        console.log(entry);
    }
    // 輸出:
    // title
    // formate

不同集合,會(huì)使用不同的默認(rèn)迭代器,Array和Set使用的是values()迭代器,而Map則使用的是entries()迭代器。

string 迭代器

特點(diǎn): 與Array類(lèi)似。string也可以通過(guò)下標(biāo)訪(fǎng)問(wèn)字符內(nèi)容。由于下標(biāo)操作是編碼單元而非字符,所以無(wú)法訪(fǎng)問(wèn)雙字節(jié)符。在Unicode支持不好的版本(node或?yàn)g覽器引擎),會(huì)出現(xiàn)錯(cuò)誤。如果使用for-of,則不會(huì)出現(xiàn)這種問(wèn)題,因?yàn)槠洳僮鞯氖亲址蔷幋a單元。
思考一個(gè)問(wèn)題:展開(kāi)運(yùn)算符與非數(shù)組可迭代對(duì)象
如果對(duì)可迭代對(duì)象使用展開(kāi)運(yùn)算,會(huì)調(diào)用默認(rèn)迭代器嗎?返回又是什么呢?
非數(shù)組可迭代對(duì)象呢?
示例:

let o = {
    a: "aaaa",
    b: 123,
    c: "ffffd",
    *[Symbol.iterator]() {
        yield this.a;
        yield this.b;
        yield this.c;
    }
}

let ar = [...o];
console.log(ar);
for(let item of ar) {
    console.log(item);
}
// 輸出
// [ "aaaa", 123, "ffffd" ]
// aaaa
// 123
// ffffd
迭代器高級(jí)功能 給迭代器傳參

這次先做示例,再做說(shuō)明。
示例1:

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

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

示例2:

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

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

示例3:

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

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

示例4

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

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

示例5:

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

let iterator = createIterator();
 console.log(iterator.next());
 console.log(iterator.next());
 console.log(iterator.next());
 console.log(iterator.next());
// 輸出:
// { value: 1, done: false }
// { value: NaN, done: false }
// { value: NaN, done: false }
// { value: undefined, done: true }

示例5的輸出結(jié)果,是不是很意外?yield返回變量與正常變量賦值有何不同?
分析:

傳遞參數(shù)會(huì)替代上一次yield的返回值

第一個(gè)next()執(zhí)行,傳參無(wú)效。因?yàn)榈谝淮握{(diào)用yield時(shí),之前沒(méi)有任何yield語(yǔ)句執(zhí)行

非yield返回值 ,不受next()參數(shù)影響

在一個(gè)含參的yield語(yǔ)句中,表達(dá)式右側(cè)等價(jià)于第一次調(diào)用next()方法后下一個(gè)返回值。表達(dá)式左側(cè)等價(jià)于第二次調(diào)用next()方法后,在函數(shù)繼續(xù)執(zhí)行前得到的返回值。

拋出錯(cuò)誤

這個(gè)也先示例,后說(shuō)明。
示例1:

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

let iterator = createIterator();
 console.log(iterator.next());
 console.log(iterator.next(4));
 console.log(iterator.throw(new Error("Boom")));
 console.log(iterator.next(5));
// 輸出:
// { value: 1, done: false }
// { value: 6, done: false }
// xx/iterator.js:146
//    let second = yield first + 2;
//                 ^
//
// Error: Boom

分析:前兩個(gè)表達(dá)式正常求值,在繼續(xù)執(zhí)行l(wèi)et second 求值前,錯(cuò)誤就會(huì)被拋出,并阻止了代碼繼續(xù)執(zhí)行。
這個(gè)過(guò)程,與直接拋出異常很相似,只是拋出的時(shí)機(jī)不同。
示例2

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

let iterator = createIterator();
 console.log(iterator.next());
 console.log(iterator.next(4));
 console.log(iterator.throw(new Error("Boom")));
 console.log(iterator.next(5));

// 輸出:
// { value: 1, done: false }
// { value: 6, done: false }
// { value: 9, done: false }
// { value: undefined, done: true }

分析:
用try...catch語(yǔ)句來(lái)捕獲異常,包裹著第二名語(yǔ)句。盡管這條語(yǔ)句本身沒(méi)有錯(cuò)誤,但在給second賦值前,還是會(huì)拋出錯(cuò)誤,catch代碼塊捕捉到這個(gè)錯(cuò)誤后,并把second = 6. 下一條yield語(yǔ)句繼續(xù)執(zhí)行后,返回9.

返回語(yǔ)句

基本上兩個(gè)示例可以概括。
示例1

function *createIterator() {
    yield 1;
    return;
    yield 2;
    yield 3;
}

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

示例2

function *createIterator() {
    yield 1;
    return 33;
    yield 2;
    yield 3;
}

let iterator = createIterator();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// 輸出:
// { value: 1, done: false }
// { value: 33, done: true }
// { value: undefined, done: true }
委托生成

先看三個(gè)示例吧,這個(gè)只是語(yǔ)法規(guī)范。
示例1

function *createNumIterator() {
    yield 1;
    yield 2;
}

function *createColorIterator() {
    yield "red";
    yield "green";
}

function *createCombinedIterator() {
    yield *createNumIterator();
    yield *createColorIterator();
    yield true;
}

var iterator = createCombinedIterator();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

// 輸出:
// { value: 1, done: false }
// { value: 2, done: false }
// { value: "red", done: false }
// { value: "green", done: false }
// { value: true, done: false }
// { value: undefined, done: true }

分析:語(yǔ)法規(guī)范,多個(gè)迭代器合并,可以創(chuàng)建一個(gè)生成器,再給yield語(yǔ)句添加一個(gè)號(hào),就可以將生成數(shù)據(jù)的過(guò)程委托給其他迭代器。當(dāng)定義這些生成器時(shí),只需要將號(hào)放置在關(guān)鍵字yield和生成器的函數(shù)名之間即可。
示例2

function *createNumIterator() {
    yield 1;
    yield 2;
    return 3;
}

function *createRepeatIterator(count) {
    for (let i = 0; i < count; i++){
        yield "repeat";
    }
}

function *createCombinedIterator() {
    let result = yield *createNumIterator();
    yield *createRepeatIterator(result);
}

var iterator = createCombinedIterator();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// 輸出 :
// { value: 1, done: false }
// { value: 2, done: false }
// { value: "repeat", done: false }
// { value: "repeat", done: false }
// { value: "repeat", done: false }
// { value: undefined, done: true }

分析:執(zhí)行過(guò)程,先被委托給了createNumIterator(),返回值會(huì)被賦給變量result,執(zhí)行到return 3時(shí),返回精數(shù)值3。這個(gè)值隨后被傳入createRepeatIterator()方法。
但是,無(wú)論通過(guò)何種方式調(diào)用next()方法,數(shù)值3永遠(yuǎn)不會(huì)被返回,它只存在于createCombinedIterator()的內(nèi)部。如果要輸出3,參看示例3。
示例3

function *createNumIterator() {
    yield 1;
    yield 2;
    return 3;
}

function *createRepeatIterator(count) {
    for (let i = 0; i < count; i++){
        yield "repeat";
    }
}

function *createCombinedIterator() {
    let result = yield *createNumIterator();
    yield result;
    yield *createRepeatIterator(result);
}

var iterator = createCombinedIterator();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// 輸出:
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: "repeat", done: false }
// { value: "repeat", done: false }
// { value: "repeat", done: false }
// { value: undefined, done: true }

期待的3,出來(lái)了。

異步任務(wù)執(zhí)行

生成器支持在函數(shù)中暫停代碼執(zhí)行,可以挖掘異步處理的更多方法。

簡(jiǎn)單任務(wù)執(zhí)行器

示例:

function run(taskDef) {

    // 創(chuàng)建迭代器
    let task = taskDef();
    // 開(kāi)始執(zhí)行任務(wù)
    let result = task.next();

    function step() {
        if (!result.done) {
            result = task.next();
            step();
        }
    }

    step();
}

run(function *() {
    console.log(1);
    yield;
    console.log(2);
    yield;
    console.log(3);
    yield;
});

分析:

函數(shù)run()接受一個(gè)生成器作為參數(shù),這個(gè)函數(shù)定義了后續(xù)要執(zhí)行的任務(wù),生成一個(gè)迭代器并將它存儲(chǔ)在變量task中。

首次調(diào)用next(),返回的結(jié)果被存儲(chǔ)起來(lái),稍后繼續(xù)使用。

step()函數(shù)檢查result.done的值,false時(shí),繼續(xù)執(zhí)行next()方法,并執(zhí)行step()操作。

每次執(zhí)行next()返回值會(huì)覆蓋變量result原來(lái)的值

傳參

示例:

function run(taskDef) {

    // 創(chuàng)建迭代器
    let task = taskDef();
    // 開(kāi)始執(zhí)行任務(wù)
    let result = task.next();

    function step() {
        if (!result.done) {
            result = task.next(result.value);
            step();
        }
    }

    step();
}

run(function *() {
   let value = yield 1;
   console.log(value);

   value = yield value + 3;
   console.log(value);
});

注意yield表達(dá)式求值。

異步

示例:

// redux-saga 經(jīng)典應(yīng)用

redux-saga
Iterator&Generator 之 MDN 說(shuō)明

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

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

相關(guān)文章

  • ES6&amp;ES7中的異步Generator的語(yǔ)法

    摘要:第二次同理,遇到了第二個(gè)函數(shù)會(huì)停下來(lái),輸出的遍歷器對(duì)象值為,的值依然是。比如返回的遍歷器對(duì)象,都會(huì)有一個(gè)方法,這個(gè)方法掛在原型上。這三個(gè)函數(shù)共同的作用是讓函數(shù)恢復(fù)執(zhí)行。 Generator的語(yǔ)法 generator的英文意思是生成器 簡(jiǎn)介 關(guān)于Generator函數(shù),我們可以理解成是一個(gè)狀態(tài)機(jī),里面封裝了多種不同的狀態(tài)。 function* gener(){ yield hel...

    djfml 評(píng)論0 收藏0
  • ES6&amp;ES7中的異步async函數(shù)

    摘要:更好的語(yǔ)義和分別表示異步和等待,比起和更容易理解。前邊聲明關(guān)鍵字,表示內(nèi)部有內(nèi)部操作,調(diào)用函數(shù)會(huì)返回一個(gè)對(duì)象。等價(jià)于其中函數(shù)就是自動(dòng)執(zhí)行器。 async函數(shù) 定義 async函數(shù)其實(shí)就是之前說(shuō)過(guò)的Generator的語(yǔ)法糖,用于實(shí)現(xiàn)異步操作。它是ES2017的新標(biāo)準(zhǔn)。 讀取兩個(gè)文件: const fs = require(fs) const readFile = function(f...

    dongxiawu 評(píng)論0 收藏0
  • ES6IteratorGenerator

    摘要:舉個(gè)例子遍歷器生成函數(shù),作用就是返回一個(gè)遍歷器對(duì)象,方法返回一個(gè)對(duì)象,表示當(dāng)前數(shù)據(jù)成員的信息。該對(duì)象本身也具有屬性,執(zhí)行后返回自身。 Iterator的作用 一是為各種數(shù)據(jù)結(jié)構(gòu),提供一個(gè)統(tǒng)一的、簡(jiǎn)便的訪(fǎng)問(wèn)接口;(統(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
  • ES6Iterator、Generator

    摘要:舉個(gè)例子遍歷器生成函數(shù),作用就是返回一個(gè)遍歷器對(duì)象,方法返回一個(gè)對(duì)象,表示當(dāng)前數(shù)據(jù)成員的信息。該對(duì)象本身也具有屬性,執(zhí)行后返回自身。 Iterator的作用 一是為各種數(shù)據(jù)結(jié)構(gòu),提供一個(gè)統(tǒng)一的、簡(jiǎn)便的訪(fǎng)問(wèn)接口;(統(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)論

閱讀需要支付1元查看
<