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

資訊專欄INFORMATION COLUMN

TypeScript迭代器

VishKozus / 2218人閱讀

摘要:迭代器重寫迭代器方法需需以上版本。返回一個對象的無參函數(shù),被返回對象需符合迭代器協(xié)議。重寫迭代器在文件中可以省略掉對屬性的定義。但實際上可以為任何對象內(nèi)置迭代器行為這里使用來模擬一部分的邏輯。

迭代器

重寫迭代器方法需 ECMAScript 2015(ES6) , TypeScript 需 1.5 以上版本。

可迭代協(xié)議

可迭代協(xié)議 允許 JavaScript 對象去定義或定制它們的迭代行為, 例如(定義)在一個 for..of 結(jié)構(gòu)中什么值可以被循環(huán)(得到)。一些內(nèi)置類型都是內(nèi)置的可遍歷對象并且有默認(rèn)的迭代行為, 比如 Array or Map, 另一些類型則不是 (比如Object) 。

為了變成可遍歷對象, 一個對象必須實現(xiàn) @@iterator 方法, 意思是這個對象(或者它原型鏈prototype chain上的某個對象)必須有一個名字是 Symbol.iterator 的屬性:

使用迭代器

以下代碼全部使用 TypeScript, TypeScript 版本號為 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]    返回一個對象的無參函數(shù),被返回對象需符合迭代器協(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文件中,可以省略掉對 [Symbol.iterator] 屬性的定義。
//next() 返回的數(shù)據(jù)中,
//done為布爾值,按照約定應(yīng)為是否已經(jīng)進行到函數(shù)邊界的描述
//value 則為當(dāng)前可迭代對象的某個屬性值。在js文件中, done為true 可省略。但實際上,value可以為任何js對象

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 來 模擬一部分 for...of 的邏輯。


console.log([...someArray] );    // [ 1, 5, 7 ]
console.log([...someArrayEntries]);//[ [ 0, 1 ], [ 1, 5 ], [ 2, 7 ] ]

//內(nèi)置可迭代對象皆可使用上述2種語法進行遍歷其鍵值對。
//String, Array, TypedArray, Map and Set 是內(nèi)置可迭代對象, 因為它們的原型對象都有一個 @@iterator 方法。
//除此之外由用戶自己實現(xiàn)的 @@iterator 方法也可以使用上述2中語法。
生成器函數(shù)

function* 聲明 (function關(guān)鍵字后跟一個星號)定義了一個生成器函數(shù) (generator function),它返回一個 Generator 對象。

注意:箭頭函數(shù) 無法作為生成器函數(shù)。

生成器

>生成器是一種可以從中退出并在之后重新進入的函數(shù)。生成器的環(huán)境(綁定的變量)會在每次執(zhí)行后被保存,下次進入時可繼續(xù)使用。

yield

>yield 關(guān)鍵字用來暫停和恢復(fù)一個生成器函數(shù) ( (function* 或 legacy generator).

yield*

>yield* 可以把需要 yield 的值委托給另外一個生成器或者其他任意的可迭代對象。

function* anotherGenerator(i) {
  yield i + 1;  //yield 會返回當(dāng)前語句的值,類似于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ù)會返回一個生成器,保存了當(dāng)前函數(shù)運行環(huán)境上下文,同時定義了next()方法來恢復(fù)函數(shù)運行直至下一條yield語句。

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ù)來實現(xiàn)迭代功能,很顯然比之前實現(xiàn) Iterator 系列接口要方便快捷的多。

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

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

相關(guān)文章

  • 使用TypeScript開發(fā)微信小程序

    摘要:使用開發(fā)微信小程序基礎(chǔ)接口核心設(shè)計原則之一就是類型檢查,通過使用接口可以進行類型檢查,滿足傳統(tǒng)面向?qū)ο笏枷耄谟行ч_發(fā),有效避免類型轉(zhuǎn)換問題。使用開發(fā)微信小程序基礎(chǔ)迭代器為每一個對象定義了默認(rèn)的迭代器。 使用TypeScript開發(fā)微信小程序(1)——基礎(chǔ):數(shù)據(jù)類型(Type) ?TypeScript 的基本數(shù)據(jù)類型有boolean、number、string 、array、enum...

    xingpingz 評論0 收藏0
  • TS下的裝飾者模式(Decorator)

    摘要:裝飾者模式裝飾者模式就是動態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計模式。下的實現(xiàn)里的裝飾器目前處在建議征集的第二階段,不被瀏覽器所支持,如果想要提前使用這個新特性就需要,等工具進行轉(zhuǎn)譯。這里介紹下的用法。 1.1、裝飾者模式 裝飾者模式就是動態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計模式。在程序運行時動態(tài)的給一個具備基礎(chǔ)功能的類或?qū)ο筇砑有碌墓δ?,并且不會改變會破壞基礎(chǔ)類和對象的功能。先提煉出產(chǎn)品的最小可用產(chǎn)品...

    SolomonXie 評論0 收藏0
  • 【譯】關(guān)于轉(zhuǎn)譯 JavaScript 程序員需要知道的

    摘要:他們的計劃是,使用微軟開發(fā)者們所習(xí)慣的其他語言的開發(fā)工具所支持的靜態(tài)類型,得到更好的代碼。在微軟內(nèi)部,被和以及團隊所使用,而且它被系的等公司使用。標(biāo)準(zhǔn)的編輯,同時也是微軟項目高級經(jīng)理的也同意。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/895原文:http://thenewstack.io/javascript-transpilers-n...

    freecode 評論0 收藏0
  • ESLint 在中大型團隊的應(yīng)用實踐

    摘要:自動化接入和升級方案通過命令行工具提供一鍵接入升級能力,同時集成到團隊腳手架中,大大降低了工程接入和維護的成本。原始代碼經(jīng)過解析器的解析,在管道中逐一經(jīng)過所有規(guī)則的檢查,最終檢測出所有不符合規(guī)范的代碼,并輸出為報告。 引言 代碼規(guī)范是軟件開發(fā)領(lǐng)域經(jīng)久不衰的話題,幾乎所有工程師在開發(fā)過程中都會遇到,并或多或少會思考過這一問題。隨著前端應(yīng)用的大型化和復(fù)雜化,越來越多的前端工程師和團隊開始重...

    alogy 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<