日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Iterator 和 for...of 循环

發(fā)布時(shí)間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Iterator 和 for...of 循环 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Iterator 和 for...of 循環(huán)

Iterator(遍歷器)意義

為Array、Object、Map、Set四種數(shù)據(jù)集合,提供統(tǒng)一的接口機(jī)制來處理所有不同的數(shù)據(jù)結(jié)構(gòu) 。

任何數(shù)據(jù)結(jié)構(gòu),只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié) 構(gòu)的所有成員) 。

接口

//遍歷器接口 interface Iterable{[Symbol.iterator]():Iterator, } //指針對(duì)象 interface Iterator{next(value?:any):IterationResult, } //返回結(jié)果 interface IterationResult{value:any,done:boolean }

生成器
Generator 函數(shù)的調(diào)用方法與普通函數(shù)一樣,也是在函數(shù)名后面加上一對(duì)圓括號(hào)。不同 的是 ,
調(diào)用 Generator 函數(shù)后,該函數(shù)并不執(zhí)行 , 返回的也不是函數(shù)運(yùn)行結(jié)果 , 而是一個(gè)指 向內(nèi) 部狀態(tài)
的指針對(duì)象, 也就是上一章介紹的遍歷器對(duì)象 Iterator Object ) 。
調(diào)用 Generator 函數(shù)返回一個(gè)遍歷器對(duì)象,代表 Generator 函數(shù)的內(nèi)部指針 。 以
后,每次調(diào)用遍歷器對(duì)象的 next 方法,就會(huì)返回 一個(gè)有著 value 和 done 兩個(gè)屬性的對(duì)象 。
value 屬性表示當(dāng)前的內(nèi)部狀態(tài)的值,是 yield 語(yǔ)句后面那個(gè)表達(dá)式的值 : done 屬性是一個(gè)
布爾值,表示是否遍歷結(jié)束

作用

  • 為各種數(shù)據(jù)結(jié)構(gòu)提供一個(gè)統(tǒng)一 的、簡(jiǎn)便的訪問接口;
  • 使得 數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種次序排列;
  • ES6 創(chuàng)造了 一種新的遍歷命令一for . . . of 循環(huán), Iterator 接口 主要供 for ... of 消費(fèi)。
  • 過程

  • 創(chuàng)建一個(gè)指針對(duì)象,指向當(dāng)前數(shù)據(jù)結(jié)構(gòu)的起始位置 。 也就是說,遍歷器對(duì)象本質(zhì)上就是 一個(gè)指針對(duì)象 。
  • 第一次調(diào)用指針對(duì)象的 next 方法,可以將指針指向數(shù)據(jù)結(jié)構(gòu)的第 一個(gè)成員 。
  • 第二次調(diào)用指針對(duì)象的 next 方法,指針就指向數(shù)據(jù)結(jié)構(gòu)的第二個(gè)成員 。
  • 不斷調(diào)用指針對(duì)象的 next 方法,直到它指向數(shù)據(jù)結(jié)構(gòu)的結(jié)束位置 。
  • 原理

    每次調(diào)用 next 方法都會(huì)返回?cái)?shù)據(jù)結(jié)構(gòu)的當(dāng)前成員的信息。具體來說,就是返回一個(gè)包含 value 和 done 兩個(gè)屬性的對(duì)象。其中, value 屬性是當(dāng)前成員的值, done 屬性是一個(gè)布爾值

    與其他遍歷語(yǔ)法的比較

    以數(shù)組為例, JavaScript 提供了多種遍歷語(yǔ)法。最原始的寫法就是 for 循環(huán) 。

    //麻煩 for (var index = 0; index < myArray.length ; index++) { console.log(myArray[index]); } // 不能跳出 myArray.forEach(function (value) {console.log(value) ; })//被設(shè)計(jì)用來遍歷對(duì)象,而不是數(shù)組 for(let i in myArray){console.log(i) } //簡(jiǎn)潔,可跳出,統(tǒng)一接口 for(let i of myArray){console.log(i) }//for ... of的等價(jià)寫法 let iterator = myArray[Symbol.iterator](); let item = iterator.next(); while(!item.done){console.log(item.value);item = iterator.next(); }

    這種寫法比較麻煩,因此數(shù)組提供了內(nèi)置的 forEach 方法。

    這種寫法的問題在于,無法中途跳出 forEach 循環(huán), break 命令或 return 命令都不能 奏效

    for ... in循環(huán)可以遍歷數(shù)組的鍵名。

    for ... in 循環(huán)有幾個(gè)缺點(diǎn)。

    • 數(shù)組的鍵名是數(shù)字,但是 for ... in 循環(huán)是以字符串作為鍵名,“0”、“ 1 ”、" 2 ”等。
    • for ... in 循環(huán)不僅可以遍歷數(shù)字鍵名,還會(huì)遍歷手動(dòng)添加的其他鍵,甚至包括原 型鏈上的鍵。
    • 某些情況下, for ... in 循環(huán)會(huì)以任意順序遍歷鍵名

    總之, for . .. in 循環(huán)主要是為遍歷對(duì)象而設(shè)計(jì)的,不適用于遍歷數(shù)組。

    for ... of 循環(huán)相比上面幾種做法有一些顯著的優(yōu)點(diǎn)。

    • 有著同 for ... in 一樣的簡(jiǎn)潔語(yǔ)法,但是沒有 for ... in 那些缺點(diǎn)。
    • 不同于 forEach 方法 , 它可以與 break 、 continue 和 return 配合使用 。
    • 提供了遍歷所有數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一操作接口。

    總結(jié)

    以上是生活随笔為你收集整理的Iterator 和 for...of 循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。