摘要:迭代器重寫迭代器方法需需以上版本。返回一個(gè)對(duì)象的無(wú)參函數(shù),被返回對(duì)象需符合迭代器協(xié)議。重寫迭代器在文件中可以省略掉對(duì)屬性的定義。但實(shí)際上可以為任何對(duì)象內(nèi)置迭代器行為這里使用來(lái)模擬一部分的邏輯。
迭代器
可迭代協(xié)議重寫迭代器方法需 ECMAScript 2015(ES6) , TypeScript 需 1.5 以上版本。
可迭代協(xié)議 允許 JavaScript 對(duì)象去定義或定制它們的迭代行為, 例如(定義)在一個(gè) for..of 結(jié)構(gòu)中什么值可以被循環(huán)(得到)。一些內(nèi)置類型都是內(nèi)置的可遍歷對(duì)象并且有默認(rèn)的迭代行為, 比如 Array or Map, 另一些類型則不是 (比如Object) 。
為了變成可遍歷對(duì)象, 一個(gè)對(duì)象必須實(shí)現(xiàn) @@iterator 方法, 意思是這個(gè)對(duì)象(或者它原型鏈prototype chain上的某個(gè)對(duì)象)必須有一個(gè)名字是 Symbol.iterator 的屬性:
使用迭代器以下代碼全部使用 TypeScript, TypeScript 版本號(hào)為 2.0.10, 使用 ES6 規(guī)范。
var someArray = [1, 5, 7]; var someArrayEntries = someArray.entries(); console.log(someArrayEntries.toString()); // "[object Array Iterator]" console.log(someArrayEntries === someArrayEntries[Symbol.iterator]()); // true console.log([...someArray] ); //[1,5,7] let iterator = someArrayEntries[Symbol.iterator](); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); //[Symbol.iterator] 返回一個(gè)對(duì)象的無(wú)參函數(shù),被返回對(duì)象需符合迭代器協(xié)議。重寫迭代器
someArray[Symbol.iterator] = ()=>{ return { _index:0, next: function() { if(this._index < someArray.length ){ return { value: someArray[this._index++], done: false} }else{ return { value: undefined, done:true} } }, [Symbol.iterator]:()=>{ return this; } }; }; //在js文件中,可以省略掉對(duì) [Symbol.iterator] 屬性的定義。 //next() 返回的數(shù)據(jù)中, //done為布爾值,按照約定應(yīng)為是否已經(jīng)進(jìn)行到函數(shù)邊界的描述 //value 則為當(dāng)前可迭代對(duì)象的某個(gè)屬性值。在js文件中, done為true 可省略。但實(shí)際上,value可以為任何js對(duì)象 let someArrayIterator = someArray[Symbol.iterator](); console.log(someArrayIterator.next()); //{ value: 1, done: false } console.log(someArrayIterator.next()); //{ value: 5, done: false } console.log(someArrayIterator.next()); //{ value: 7, done: false } console.log(someArrayIterator.next()); //{ value: undefined, done: true } console.log(someArrayIterator.next()); //{ value: undefined, done: true } someArrayEntries[Symbol.iterator] = ()=>{ return { _index:0, next: function() { if(this._index < someArray.length){ return { value: [this._index,someArray[this._index++]], done: false} }else{ return { value: [this._index,undefined], done:true} } }, [Symbol.iterator]:()=>{ return this; } }; }; console.log(someArrayEntries === someArrayEntries[Symbol.iterator]()); //false iterator = someArrayEntries[Symbol.iterator](); console.log(iterator.next()); //{ value: [ 0, 1 ], done: false } console.log(iterator.next()); //{ value: [ 1, 5 ], done: false } console.log(iterator.next()); //{ value: [ 2, 7 ], done: false } console.log(iterator.next()); //{ value: [ 3, undefined ], done: true } console.log(iterator.next()); //{ value: [ 3, undefined ], done: true }內(nèi)置迭代器行為
for(let obj of someArray){ console.log(obj); } // 1 5 7 let someArrayIterator = someArray[Symbol.iterator](); let obj = someArrayIterator.next(); while(!obj.done){ console.log(obj.value) obj = someArrayIterator.next(); } // 1 5 7 //這里使用 while 來(lái) 模擬一部分 for...of 的邏輯。 console.log([...someArray] ); // [ 1, 5, 7 ] console.log([...someArrayEntries]);//[ [ 0, 1 ], [ 1, 5 ], [ 2, 7 ] ] //內(nèi)置可迭代對(duì)象皆可使用上述2種語(yǔ)法進(jìn)行遍歷其鍵值對(duì)。 //String, Array, TypedArray, Map and Set 是內(nèi)置可迭代對(duì)象, 因?yàn)樗鼈兊脑蛯?duì)象都有一個(gè) @@iterator 方法。 //除此之外由用戶自己實(shí)現(xiàn)的 @@iterator 方法也可以使用上述2中語(yǔ)法。生成器函數(shù)
function* 聲明 (function關(guān)鍵字后跟一個(gè)星號(hào))定義了一個(gè)生成器函數(shù) (generator function),它返回一個(gè) Generator 對(duì)象。
注意:箭頭函數(shù) 無(wú)法作為生成器函數(shù)。
生成器
>生成器是一種可以從中退出并在之后重新進(jìn)入的函數(shù)。生成器的環(huán)境(綁定的變量)會(huì)在每次執(zhí)行后被保存,下次進(jìn)入時(shí)可繼續(xù)使用。
yield
>yield 關(guān)鍵字用來(lái)暫停和恢復(fù)一個(gè)生成器函數(shù) ( (function* 或 legacy generator).
yield*
>yield* 可以把需要 yield 的值委托給另外一個(gè)生成器或者其他任意的可迭代對(duì)象。
function* anotherGenerator(i) { yield i + 1; //yield 會(huì)返回當(dāng)前語(yǔ)句的值,類似于return。但在生成器函數(shù)中,return受到使用限制。 yield i + 2; yield i + 3; } function* generator(i){ yield i; yield* anotherGenerator(i); yield i + 10; } var gen = generator(10); //執(zhí)行生成器函數(shù)會(huì)返回一個(gè)生成器,保存了當(dāng)前函數(shù)運(yùn)行環(huán)境上下文,同時(shí)定義了next()方法來(lái)恢復(fù)函數(shù)運(yùn)行直至下一條yield語(yǔ)句。 console.log(gen.next().value); // 10 console.log(gen.next().value); // 11 console.log(gen.next().value); // 12 console.log(gen.next().value); // 13 console.log(gen.next().value); // 20 //使用生成器函數(shù)來(lái)實(shí)現(xiàn)迭代功能,很顯然比之前實(shí)現(xiàn) Iterator 系列接口要方便快捷的多。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82224.html
摘要:使用開(kāi)發(fā)微信小程序基礎(chǔ)接口核心設(shè)計(jì)原則之一就是類型檢查,通過(guò)使用接口可以進(jìn)行類型檢查,滿足傳統(tǒng)面向?qū)ο笏枷耄谟行ч_(kāi)發(fā),有效避免類型轉(zhuǎn)換問(wèn)題。使用開(kāi)發(fā)微信小程序基礎(chǔ)迭代器為每一個(gè)對(duì)象定義了默認(rèn)的迭代器。 使用TypeScript開(kāi)發(fā)微信小程序(1)——基礎(chǔ):數(shù)據(jù)類型(Type) ?TypeScript 的基本數(shù)據(jù)類型有boolean、number、string 、array、enum...
摘要:裝飾者模式裝飾者模式就是動(dòng)態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計(jì)模式。下的實(shí)現(xiàn)里的裝飾器目前處在建議征集的第二階段,不被瀏覽器所支持,如果想要提前使用這個(gè)新特性就需要,等工具進(jìn)行轉(zhuǎn)譯。這里介紹下的用法。 1.1、裝飾者模式 裝飾者模式就是動(dòng)態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計(jì)模式。在程序運(yùn)行時(shí)動(dòng)態(tài)的給一個(gè)具備基礎(chǔ)功能的類或?qū)ο筇砑有碌墓δ埽⑶也粫?huì)改變會(huì)破壞基礎(chǔ)類和對(duì)象的功能。先提煉出產(chǎn)品的最小可用產(chǎn)品...
摘要:他們的計(jì)劃是,使用微軟開(kāi)發(fā)者們所習(xí)慣的其他語(yǔ)言的開(kāi)發(fā)工具所支持的靜態(tài)類型,得到更好的代碼。在微軟內(nèi)部,被和以及團(tuán)隊(duì)所使用,而且它被系的等公司使用。標(biāo)準(zhǔn)的編輯,同時(shí)也是微軟項(xiàng)目高級(jí)經(jīng)理的也同意。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/895原文:http://thenewstack.io/javascript-transpilers-n...
摘要:自動(dòng)化接入和升級(jí)方案通過(guò)命令行工具提供一鍵接入升級(jí)能力,同時(shí)集成到團(tuán)隊(duì)腳手架中,大大降低了工程接入和維護(hù)的成本。原始代碼經(jīng)過(guò)解析器的解析,在管道中逐一經(jīng)過(guò)所有規(guī)則的檢查,最終檢測(cè)出所有不符合規(guī)范的代碼,并輸出為報(bào)告。 引言 代碼規(guī)范是軟件開(kāi)發(fā)領(lǐng)域經(jīng)久不衰的話題,幾乎所有工程師在開(kāi)發(fā)過(guò)程中都會(huì)遇到,并或多或少會(huì)思考過(guò)這一問(wèn)題。隨著前端應(yīng)用的大型化和復(fù)雜化,越來(lái)越多的前端工程師和團(tuán)隊(duì)開(kāi)始重...
閱讀 1972·2021-11-23 10:03
閱讀 4130·2021-11-22 09:34
閱讀 2466·2021-10-08 10:05
閱讀 2247·2019-08-30 15:53
閱讀 1686·2019-08-30 13:56
閱讀 1149·2019-08-29 16:52
閱讀 1102·2019-08-26 13:31
閱讀 3346·2019-08-26 11:45