亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

初入ES6-Generator和Iterator

waltr / 1466人閱讀

摘要:根據(jù)百度百科的說(shuō)法迭代器模式,又叫做游標(biāo)模式。給出的定義為提供一種方法訪(fǎng)問(wèn)一個(gè)容器對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。從定義可見(jiàn),迭代器模式是為容器而生。很明顯,對(duì)容器對(duì)象的訪(fǎng)問(wèn)必然涉及到遍歷算法。這兩種情況好像都能夠解決問(wèn)題。

Iterator
根據(jù)百度百科的說(shuō)法:

迭代器(Iterator)模式,又叫做游標(biāo)(Cursor)模式。GOF給出的定義為:提供一種方法訪(fǎng)問(wèn)一個(gè)容器(container)對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。 從定義可見(jiàn),迭代器模式是為容器而生。很明顯,對(duì)容器對(duì)象的訪(fǎng)問(wèn)必然涉及到遍歷算法。你可以一股腦的將遍歷方法塞到容器對(duì)象中去;或者根本不去提供什么遍歷算法,讓使用容器的人自己去實(shí)現(xiàn)去吧。這兩種情況好像都能夠解決問(wèn)題。

類(lèi)似之前的鏈表結(jié)構(gòu),每個(gè)對(duì)象不僅包含自身的值,也包含下一個(gè)變量的指針;

function Chan(value){
    this.value = value;
    this.next = null;
};
var newObj = new Chan();        //對(duì)象都有兩個(gè)屬性

創(chuàng)建迭代器

function creatIterator(items){
    var i = 0;
    var next = function(){
        var done =( i>=items.length);            //判斷itmes的數(shù)量是否是最后一個(gè),如果是done = true;那么value = undefined;
        var value = !done?items[i++]:undefined;            //
        return {
            value : value,
            done : done
        };
    }
    return {next : next};
};
var iterator = new creatIterator([3,3,2,6,7]);
iterator.next()  ->{value : 3,done:false;}
iterator.next()  ->{value : 3,done:false;}
iterator.next()  ->{value : 2,done:false;}
iterator.next()  ->{value : 6,done:false;}
iterator.next()  ->{value : 7,done:false;}
iterator.next()  ->{value :undefined,done:true;}        //后面執(zhí)行的都是一樣
//或者省略最后一步;
function creatIterator(items){
    var i = 0;
    return {
        next : function(){
            return i

所以可以這樣理解,Iterator就是一個(gè)特殊的對(duì)象,這個(gè)對(duì)象可以訪(fǎng)問(wèn)一個(gè)容器對(duì)象(包含很多無(wú)序的變量屬性等),每次調(diào)用next就返回一個(gè)對(duì)象,直到最后一個(gè),有些方法調(diào)用是自動(dòng)連續(xù)的調(diào)用,見(jiàn)生成器函數(shù)只要有這個(gè)接口就可以將返回的對(duì)象用擴(kuò)展運(yùn)算符...轉(zhuǎn)換為數(shù)組并且可以使用數(shù)組的方法
有三種數(shù)據(jù)結(jié)構(gòu)具有原生的Iterator接口,可以直接用for..of 遍歷,這三種數(shù)結(jié)構(gòu)內(nèi)置了三個(gè)迭代器
entries()返回?cái)?shù)組,keys(),values();針對(duì)不同的數(shù)據(jù)結(jié)構(gòu),都有默認(rèn)的迭代器,注意不同的瀏覽器支持的成都不一樣;
1,Array

2,Map

3,Set

一些類(lèi)數(shù)組的對(duì)象(有數(shù)字屬性,和length的屬性)也具有Iterator 的接口。比如字符串對(duì)象

Iterator應(yīng)用場(chǎng)合
1,解構(gòu)賦值

var  arr = [1,2,3,4,5];
var arr1 = [...arr];
console.dir(arr1)    //[1, 2, 3, 4, 5]

2,擴(kuò)展運(yùn)算符,同上;
3,特殊場(chǎng)合

//for...of;如果數(shù)組有非數(shù)字鍵名的話(huà)不可遍歷,arr.name = "obama"
var  arr = [1,2,3,4,"a","b"];
var obj = {name : "obama",1 : 2}
for( pro in arr){console.log(pro)}    //0,,,,5只是得到鍵名;
for( pro in obj){console.log(pro)}  //得到所有的屬性名
for( pro of o arr){console.log(pro)}  //輸出所有的屬性
for( pro of obj){console.log(pro)}      //報(bào)錯(cuò),對(duì)象不可遍歷
//Array...from;
//Map(),Set()參數(shù)對(duì)象
//Promise.all(),race()

Generator生成器函數(shù);
有三個(gè)屬性next,throw,return ;

function *fnName(){    //函數(shù)名字前必須有星號(hào);

    yield "first";    //每次執(zhí)行后都從下一個(gè)yield關(guān)鍵字開(kāi)始,直到最后的return;
    yield "second";    //yield 只能用在生成器函數(shù)內(nèi)部,其他 的會(huì)報(bào)錯(cuò)
    return "all done";
}
var ob = fnName()        //和普通函數(shù)一樣的調(diào)用
ob.next()    //
ob.next()    //
ob.next()    //每次調(diào)用都返回一個(gè)對(duì)象
//每個(gè)生成器函數(shù)都有Iterator方法并且返回自身
ob[Symbol.iteraro]() === ob;



//1,next()的方法;
//yied和return 一樣沒(méi)有返回值,或者是undefined;
function *fn(){
    var num  = yield 4;
    console.log(num);
    
}
var s = fn();
s.next();    //{value: 4, done: false}
s.next()    //undefined;{value: undefined, done: true};
//next()的參數(shù),可以明確的設(shè)定上一次yield的返回值(如果已經(jīng)是最后的話(huà),就沒(méi)有作用)
s.next(23);    //value : 23,

//生成器函數(shù)的遍歷for of ... 解構(gòu)賦值,Array.from都會(huì)自動(dòng)遍歷,不需要調(diào)用next方法
function *test(){
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    return 5;
}
var te = test();
for( v of te){console.log(v)}    //1,2,3,4
te.next();//{value: undefined, done: true}已經(jīng)循環(huán)完畢
//2,throw方法
//3,return 方法    //直接終止遍歷
function *test(){
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    return 5;
};
var s = test();
s.next();//value:1,done:false;
s.turn ();value:undefined,done:ture;    //
s.next();//value:1,done:false;
 //yield*語(yǔ)句
function *boo(){
    yield 1;
    yield 2;
}  ;
function *bar(){
    yield 3;
    yield boo();
} 
var s = bar();
s.next();//{value: 3, done: false}
s.next();//{value: boo, done: false}沒(méi)有執(zhí)行
//使用yield *boo();表明返回的是一個(gè)遍歷器對(duì)象,可以是數(shù)組等其他對(duì)象

//{value: 1, done: false}

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

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

相關(guān)文章

  • ES6-Generator與react狀態(tài)機(jī)(13)

    摘要:同理,你只要知道改變狀態(tài)能夠?qū)崿F(xiàn)要的功能,大體上的原理就是狀態(tài)機(jī)就可以了??偨Y(jié),本文重點(diǎn)狀態(tài)機(jī)模式的使用場(chǎng)景,復(fù)雜多狀態(tài)的管理,這里注意你沒(méi)必要寫(xiě)個(gè)選項(xiàng)卡之類(lèi)的用狀態(tài)機(jī),那反而是給自己找麻煩。 大家在寫(xiě)App和一些單頁(yè)面程序的時(shí)候,經(jīng)常會(huì)遇到這樣的情況:showImg(https://segmentfault.com/img/bVbsNaA?w=240&h=427);當(dāng)點(diǎn)擊左邊的箭頭的...

    alphahans 評(píng)論0 收藏0
  • 初入ES6-Array

    摘要:用于將對(duì)象轉(zhuǎn)為數(shù)組可遍歷和類(lèi)數(shù)組對(duì)象部署屬性的對(duì)象和擴(kuò)展運(yùn)算符的區(qū)別是任何具有屬性的都可以使用的方法是用原型該方法還有一個(gè)參數(shù)類(lèi)似的新方法將字符串轉(zhuǎn)化為數(shù)組,特別是大于的單個(gè)字符,避免分割成多個(gè)用來(lái)彌補(bǔ)構(gòu)造函數(shù)的歧義三個(gè)空值只有一個(gè)參數(shù)其實(shí) 1,Array.from用于將對(duì)象轉(zhuǎn)為數(shù)組(可遍歷和類(lèi)數(shù)組對(duì)象部署Iterator 屬性的對(duì)象)和擴(kuò)展運(yùn)算符的區(qū)別是任何具有Length屬性的都可...

    馬永翠 評(píng)論0 收藏0
  • 初入ES6-解構(gòu)

    摘要:允許按照一定的模式,從數(shù)組或者對(duì)象中取值,對(duì)變量進(jìn)行賦值數(shù)組解構(gòu)的對(duì)象要具有接口也就是可以遍歷按照對(duì)應(yīng)的關(guān)系進(jìn)行取值如果解構(gòu)不成功變量的值就是如果右側(cè)的數(shù)值不是數(shù)組,就會(huì)報(bào)錯(cuò)注意字符串是可以遍歷的也可以有默認(rèn)值只要被賦值的變量不是嚴(yán)格就是默 ES6允許按照一定的模式,從數(shù)組或者對(duì)象中取值,對(duì)變量進(jìn)行賦值 數(shù)組 var a = 2; var b = [1,2]; var c = this...

    FullStackDeveloper 評(píng)論0 收藏0
  • HTML & CSS之小白初入江湖

    摘要:之小白初入江湖超文本標(biāo)記語(yǔ)言簡(jiǎn)稱(chēng)是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)準(zhǔn)標(biāo)記語(yǔ)言。描述了一個(gè)網(wǎng)站的結(jié)構(gòu)語(yǔ)義隨著線(xiàn)索的呈現(xiàn),使之成為一種標(biāo)記語(yǔ)言而非編程語(yǔ)言。是塊級(jí)元素,是行內(nèi)元素。層疊樣式表簡(jiǎn)稱(chēng)是一種用來(lái)為結(jié)構(gòu)化文檔如添加樣式的工具。 HTML & CSS之小白初入江湖 1. HTML 超文本標(biāo)記語(yǔ)言(HyperText Markup Language, 簡(jiǎn)稱(chēng)HTML)是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)準(zhǔn)標(biāo)記語(yǔ)言...

    fai1017 評(píng)論0 收藏0
  • HTML & CSS之小白初入江湖

    摘要:之小白初入江湖超文本標(biāo)記語(yǔ)言簡(jiǎn)稱(chēng)是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)準(zhǔn)標(biāo)記語(yǔ)言。描述了一個(gè)網(wǎng)站的結(jié)構(gòu)語(yǔ)義隨著線(xiàn)索的呈現(xiàn),使之成為一種標(biāo)記語(yǔ)言而非編程語(yǔ)言。是塊級(jí)元素,是行內(nèi)元素。層疊樣式表簡(jiǎn)稱(chēng)是一種用來(lái)為結(jié)構(gòu)化文檔如添加樣式的工具。 HTML & CSS之小白初入江湖 1. HTML 超文本標(biāo)記語(yǔ)言(HyperText Markup Language, 簡(jiǎn)稱(chēng)HTML)是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)準(zhǔn)標(biāo)記語(yǔ)言...

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

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

0條評(píng)論

閱讀需要支付1元查看
<