Iterator 和 for...of 循環

Iterator 和 for...of 循環

Iterator(遍歷器)意義

為Array、Object、Map、Set四種數據集合,提供統一的接口機制來處理所有不同的數據結構 。

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

接口

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

生成器
Generator 函數的調用方法與普通函數一樣,也是在函數名后面加上一對圓括號。不同 的是 ,
調用 Generator 函數后,該函數并不執行 , 返回的也不是函數運行結果 , 而是一個指 向內 部狀態
的指針對象, 也就是上一章介紹的遍歷器對象 Iterator Object ) 。
調用 Generator 函數返回一個遍歷器對象,代表 Generator 函數的內部指針 。 以
后,每次調用遍歷器對象的 next 方法,就會返回 一個有著 value 和 done 兩個屬性的對象 。
value 屬性表示當前的內部狀態的值,是 yield 語句后面那個表達式的值 : done 屬性是一個
布爾值,表示是否遍歷結束

作用

  1. 為各種數據結構提供一個統一 的、簡便的訪問接口;
  2. 使得 數據結構的成員能夠按某種次序排列;
  3. ES6 創造了 一種新的遍歷命令一for . . . of 循環, Iterator 接口 主要供 for ... of 消費。

過程

  1. 創建一個指針對象,指向當前數據結構的起始位置 。 也就是說,遍歷器對象本質上就是 一個指針對象 。
  2. 第一次調用指針對象的 next 方法,可以將指針指向數據結構的第 一個成員 。
  3. 第二次調用指針對象的 next 方法,指針就指向數據結構的第二個成員 。
  4. 不斷調用指針對象的 next 方法,直到它指向數據結構的結束位置 。

原理

每次調用 next 方法都會返回數據結構的當前成員的信息。具體來說,就是返回一個包含 value 和 done 兩個屬性的對象。其中, value 屬性是當前成員的值, done 屬性是一個布爾值

與其他遍歷語法的比較

以數組為例, JavaScript 提供了多種遍歷語法。最原始的寫法就是 for 循環 。

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

這種寫法比較麻煩,因此數組提供了內置的 forEach 方法。

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

for ... in循環可以遍歷數組的鍵名。

for ... in 循環有幾個缺點。

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

總之, for . .. in 循環主要是為遍歷對象而設計的,不適用于遍歷數組。

for ... of 循環相比上面幾種做法有一些顯著的優點。

  • 有著同 for ... in 一樣的簡潔語法,但是沒有 for ... in 那些缺點。
  • 不同于 forEach 方法 , 它可以與 break 、 continue 和 return 配合使用 。
  • 提供了遍歷所有數據結構的統一操作接口。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280321.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python簡單開發接口

1、首先需要安裝flask這個模塊&#xff1a;pip install flask。flask是個輕量級的接口開發框架2、開發接口有什么作用  1、mock接口&#xff0c;模擬一些接口&#xff0c;在別的接口沒有開發好的時候&#xff0c;需要用mock去模擬一些接口。  2、知道接口是怎么開發的&…

九哥聊Kestrel網絡編程第二章:開發一個Fiddler

推薦序之前在.NET 性能優化群內交流時&#xff0c;我們發現很多朋友對于高性能網絡框架有需求&#xff0c;需要創建自己的消息服務器、游戲服務器或者物聯網網關。但是大多數小伙伴只知道 DotNetty&#xff0c;雖然 DotNetty 是一個非常優秀的網絡框架&#xff0c;廣泛應用于各…

apple tv 開發_如何跨多臺Apple TV同步Apple TV的主屏幕

apple tv 開發If you have more than one Apple TV in your household, you probably know how annoying it is when you have to install Apple TV apps multiple times on each device. However, with the release of tvOS 11, that’s no longer the case. 如果您的家庭中有…

這些故事說的都是你——譯者帶你讀《硅谷革命》

作者 | 薛命燈 作為《硅谷革命》的譯者之一&#xff0c;同時也是一個擁有十余年軟件開發和架構經驗的工程師&#xff0c;當時我在決定是否接受重譯這本書的時候&#xff0c;幾乎是不假思索地答應了郭蕾&#xff08;本書重啟版發起人之一&#xff09;的提議&#xff0c;只因他的…

runc容器逃逸漏洞最強后續:應對之策匯總與熱點疑問解答

美國時間2019年2月11日晚&#xff0c;runc通過oss-security郵件列表披露了runc容器逃逸漏洞CVE-2019-5736的詳情。runc是Docker、CRI-O、Containerd、Kubernetes等底層的容器運行時&#xff0c;此次安全漏洞無可避免地會影響大多數Docker與Kubernetes用戶&#xff0c;也因此為整…

OOD之問題空間到解空間—附FP的建模

通常會被問到&#xff0c;什么事OOD&#xff0c;然后大部分人期待的答案比較死板&#xff0c;繼承、封裝、多態&#xff01;懂這個的人多的去了&#xff0c;有什么好問&#xff1f;回答出來的人是否拿著Java又去做一些面向過程的勾當&#xff1f; 計算機革命起源于機器&#xf…

com surrogate_什么是“ COM Surrogate”(dllhost.exe),為什么它在我的PC上運行?

com surrogateIf you poke around in your Task Manager, there’s a good chance you’ll see one or more “COM Surrogate” processes running on a Windows PC. These processes have the file name “dllhost.exe”, and are part of the Windows operating system. You’…

云計算時代,互聯網金融背后的想象空間

本文講的是云計算時代&#xff0c;互聯網金融背后的想象空間&#xff0c;【IT168評論】阿里巴巴在紐交所的開市鐘史無前例的由八位合作伙伴敲響&#xff0c;可見阿里對互聯網時代構筑起生態系統的堅持。這其中&#xff0c;由余額寶所敲開的互聯網金融熱潮的熱度持續不減&#x…

JavaScript數據結構與算法——集合

1.集合數據結構 集合是一組無序且唯一&#xff08;不能重復&#xff09;的項組成的。這個數據結構使用了和有限集合相同的數學概念。 2.創建集合 function Set() {// 這里使用對象而不是數組來表示集合 // js對象中不允許一個鍵值指向兩個不同屬性&#xff0c;也保證了集合中的…

php用兩個棧來實現隊列

php用兩個棧來實現隊列 一、總結 我主要的問題是不知道的是題目描述&#xff0c;題目和貴的代碼之間的關系&#xff0c;以及返回值 思路&#xff1a;A棧做入隊操作&#xff0c;B棧做出隊操作&#xff0c;入隊的時候元素直接入A&#xff0c;出隊的時候判斷B棧是否為空&#xff0…

facebook 邀請好友_如何查看緊急情況下您的Facebook朋友是否安全

facebook 邀請好友Facebook’s Safety Check feature lets you check in during an emergency to confirm you’re safe. If you have friends or family in an area that you haven’t heard from, though, you may want to ask them directly. Here’s how to ask someone to…

【您有一封來自阿里云的邀請函】阿里云成都客戶服務中心20+職位虛席以待,來吧,成就最好的自己!...

如果你不想辜負這個科技的時代&#xff0c;相信它會因你而不同。如果你不想僅做年度大戲的觀眾&#xff0c;相信自己會成為主角。如果你不想淹沒在枯燥與茍且中&#xff0c;相信工作有詩和遠方。那么&#xff0c;不要猶豫&#xff0c;加入我們&#xff01;在這&#xff0c;你已…

A - A Secret -擴展KMP

題目大意&#xff1a;給你兩個字符串A,B&#xff0c;現在要你求B串的后綴在A串中出現的次數和后綴長度的乘積和為多少。題解&#xff1a;擴展KMP模板題&#xff0c;將A和B串都逆序以后就變成了求前綴的問題了&#xff0c;擴展KMP求處從i位置開始的最長公共前綴存于數組。最后通…

.NET 代碼優化 聊聊邏輯圈復雜度

本文屬于 dotnet 代碼優化系列博客。相信大家都對圈復雜度這個概念很是熟悉&#xff0c;本文來和大家聊聊邏輯的圈復雜度。代碼優化里面&#xff0c;一個關注的重點在于代碼的邏輯復雜度。一段代碼的邏輯復雜度越高&#xff0c;那么維護起來的難度也就越大。衡量代碼的邏輯復雜…

GO語言基礎條件、跳轉、Array和Slice

1. 判斷語句if 1. 條件表達式沒有括號&#xff08;這點其他語言轉過來的需要注意&#xff09; 2. 支持一個初始化表達式&#xff08;可以是并行方式&#xff0c;即&#xff1a;a, b, c : 1, 2, 3) 3. 左大括號必須和條件語句或 else 在同一行 4. 支持單行模式 5. 初始化語句中的…

干式真空泵原理_如何安裝干式墻錨在墻壁上懸掛重物

干式真空泵原理If you ever plan to mount something to the wall that’s even remotely heavy, you’ll need to use drywall anchors if a stud isn’t available. Here are the different types of drywall anchors, and how to use each one. 如果您打算將甚至更重的東西安…

sharding-jdbc學習

sharding-jdbc的全局id生成策略是通過雪花算法來實現的。 sharding-jdbc也是一個數據的中間件&#xff0c;可實現讀寫分離和分庫分表&#xff0c;比mycat要簡單些。 nginx與ribbon實現負載均衡的區別&#xff1a;nginx是實現服務器端的負載均衡&#xff0c;ribbon是實現客戶端即…

像go 一樣 打造.NET 單文件應用程序的編譯器項目bflat 發布 7.0版本

現代.NET和C#在低級/系統程序以及與C/C/Rust等互操作方面的能力完全令各位刮目相看了&#xff0c;有人用C#開發的64位操作系統: GitHub - nifanfa/MOOS: C# x64 operating system pro...&#xff0c;截圖要介紹的是一個結合Roslyn和NativeAOT的實驗性編譯器bflat &#xff1a;h…

添加dubbo.xsd的方法

整合dubbo-spring的時候&#xff0c;配置文件會報錯 因為 阿里關閉在線的域名了.需要本地下載xsd文件 所以&#xff0c;需要下載本地引入。 解決方式&#xff1a; 在dubbo的開源項目上找到xsd文件&#xff1a; https://github.com/alibaba/dubbo Idea使用本地xsd Setting…

Spring Cloud Feign注意點

2019獨角獸企業重金招聘Python工程師標準>>> 1、只要在啟動類中加入EnableFeignClients注解&#xff0c;才會掃描FeignClient注解 2、Feign主要是通過接口調用&#xff0c;底層其實也是HttpClient/OkHttp 1&#xff09;提供一個Feign接口&#xff0c;加入對應的rest…