Iterator 和 for...of 循環

本系列屬于阮一峰老師所著的ECMAScript 6 入門學習筆記


Iterator(遍歷器)

JavaScript表示“集合”的數據結構,除了ArrayObject ,ES6又新增了MapSet

遍歷器(Iterator)是一種統一的接口機制,用來處理所有不同的數據結構。

Iterator的作用有三個:一位各種數據結構提供一個統一的、簡便的訪問接口;二是使得數據結構的成員能夠按照某種次序排列;三是ES6創造了一種新的命令for..of循環,Iterator接口主要供for...of消費

默認Iterator接口

ES6規定,默認的Iterator接口部署在數據結構的Symbol.iterator屬性,一個數據結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”(iterable)。

可遍歷的數據結構具有Symbol.iterator屬性。執行這個屬性會返回一個遍歷器對象。該對象的根本特征就是具有next方法,每次調用next方法都會返回一個代表當前隊員的信息對象,具有valuedone兩個屬性。

原生具備Iterator接口的數據類型如下:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函數的arguments對象
  • NodeList對象
// 原生部署Itertor接口的數據接口,不用自己寫遍歷器生成函數,可使用for...of
lelt arr = [1,2,3]
let iter = arr[Symbol.iterator]()
iter.next() // {value:1,done:false}
iter.next() // {value:2,done:false}
iter.next() // {value:3,done:false}
iter.next() // {value:undefined,done:false}// 類似對象不具備Itertor接口,需要自己部署Symbol.iterator屬性
let obj = {data: ['hello','world'],[Symbol.iterator](){const self = thislet index = 0return {next(){if(index < self.data.length){return {value: self.data[index++],done: false}}else{return {value: undefined,done:true}}}}}
}// 類數組對象(存在數值鍵名和length屬性),Symbol.iterator方法可直接引用數組的Iterator接口
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]
遍歷器對象的return(),throw()

遍歷器對象除了具有next方法,還具有return方法和throw方法

return方法的使用場合是:如果for...of循環提前退出(通常是因為出錯,或者有break語句或continue語句,就會調用return方法。如果一個對象在完成遍歷前需要清理或釋放資源,就可以部署return方法)

throw方法主要是配合Generator函數使用,一般遍歷器對象用不到這個方法

for...of循環

ES6 借鑒 C++、Java、C# 和 Python 語言,引入了for...of循環,作為遍歷所有數據結構的統一的方法。

JavaScript提供多種遍歷語法,最原始的for循環,比較麻煩。

數組提供內置的forEach方法,但是無法中途跳出循環,不能使用breakreturn

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

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

與以上遍歷相比,for...of有一些顯著的優點

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

轉載于:https://www.cnblogs.com/pengzhixin/p/7693123.html

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

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

相關文章

JAVA常量

2019獨角獸企業重金招聘Python工程師標準>>> 常量就是一個固定值。它們不需要計算&#xff0c;直接代表相應的值。 常量指不能改變的量。 在Java中用final標志&#xff0c;聲明方式和變量類似&#xff1a; final double PI 3.1415927; 雖然常量名也可以用小寫&…

基于Docker托管Azure DevOps代理

Azure DevOps非常好用&#xff0c;但是為代理準備單獨的服務器經常會顯得性價比不高&#xff1a;配置低了&#xff0c;前端構建時會教會你做人&#xff0c;配置太高又有點浪費資源&#xff0c;代理數量少了各團隊構建要打架。對于既想享受DevOps的美妙之處但是資源捉襟見肘的小…

微軟 word轉換pdf_如何將行轉換為Microsoft Word表中的列

微軟 word轉換pdfYou’ve created a table in Word and started to enter your data. Then, you realize that the table should be transposed, meaning the rows should be columns and vice versa. Rather than recreating the table and manually entering the data again,…

pycharm中如何正確配置pyqt5

網上看了幾個文章&#xff0c;不成功。這樣做才是正確姿勢&#xff1a; /Users/mac/anaconda3/bin/Designer.app /Users/mac/anaconda3/bin$ProjectFileDir$ pyuic5 $FileName$ -o $FileNameWithoutExtension$.py $ProjectFileDir$ 其它細節懶得說。 轉載于:https://www.cnblog…

JS常用的設計模式

持續更新JS常用的設計模式以及應用場景*以下內容為個人簡單理解以及摘抄部分網上demo組成&#xff0c;有錯誤請在下方評論指出?*# 何謂設計模式沒必要被高大上的名詞所嚇倒&#xff0c;日常coding中或許一個不了解各種設計模式的程序員可能自己其實已經用到了很多拋開官方的定…

如何在Photoshop中制作雙曝光圖像

Double exposure images are popular at the moment. Taylor Swift’s Style music video and the True Detective opening theme both used the effect. It’s a technique where two separate photos—typically a portrait and a landscape—are blended together into one …

記一次.NET 某安全生產系統 CPU爆高分析

一&#xff1a;背景 1.講故事今天是&#x1f40f;的第四天&#xff0c;頭終于不巨疼了&#xff0c;寫文章已經沒什么問題&#xff0c;趕緊爬起來寫。這個月初有位朋友找到我&#xff0c;說他的程序出現了CPU爆高&#xff0c;讓我幫忙看下怎么回事&#xff0c;簡單分析了下有兩點…

JDBC 學習筆記(一)—— JDBC 基礎

1. 什么是 JDBC JDBC&#xff0c;Java Database Connectivity&#xff08;Java 數據庫連接&#xff09;&#xff0c;是一組執行 SQL 語句的 Java API。 JDBC&#xff0c;是 Java SE&#xff08;Java Platform, Standard Edition&#xff09;標準的一部分。 Java 程序可以通過 J…

JavaScript享元模式

JavaScript享元模式 通過兩個例子的對比來凸顯享元模式的特點&#xff1a;享元模式是一個為了提高性能(空間復雜度)的設計模式&#xff0c;享元模式可以避免大量非常相似類的開銷。 第一實例&#xff0c;沒有使用享元模式&#xff0c;計算所花費的時間和空間使用程度。 要求為&…

mac屏幕截圖_如何在Mac上拍攝屏幕截圖

mac屏幕截圖On a Mac, you can take screenshots with a few quick keyboard shortcuts. But Mac OS X also includes more powerful screenshot tools, too. Here are some of the many ways you can get a screenshot on OS X. 在Mac上&#xff0c;您可以使用一些快速的鍵盤快…

實現 .Net 7 下的數據庫定時檢查

在軟件開發過程中&#xff0c;有時候我們需要定時地檢查數據庫中的數據&#xff0c;并在發現新增數據時觸發一個動作。為了實現這個需求&#xff0c;我們在 .Net 7 下進行一次簡單的演示。PeriodicTimer .Net 6 中新增了 PeriodicTimer 這個類&#xff0c;它可以用來創建一個定…

新手AS常見問題集錦

開發環境 以前開發android的時候可以使用eclipse&#xff0c;雖然現在也能使用eclipse&#xff0c;但是google已經不再支持使用eclipse開發android了。因為google有了自己的IDE---android studio&#xff0c;這個IDE我自己認為安裝的時候比較方便&#xff0c;唯一的缺點就是在下…

js進階 11-6 jquery如何獲取和設置元素的寬高(jquery多方法)

js進階 11-6 jquery如何獲取和設置元素的寬高&#xff08;jquery多方法&#xff09; 一、總結 一句話總結&#xff1a;jquery里面多是方法啊&#xff0c;比如jquery對象的寬高。所以取值是方法&#xff0c;賦值就是方法里面帶參數。 1、百度富文本編輯器ueditor如何設置寬高&a…

SparseArray代替HashMap

相信大家都明白&#xff0c;手機軟件的開發不同于PC軟件的開發&#xff0c;因為手機性能相對有限&#xff0c;內存也有限&#xff0c;所謂“寸土寸金”&#xff0c;可能稍有不慎&#xff0c;就會導致性能的明顯降低。Android為了方便開發者&#xff0c;特意在android.util這個包…

也許你曾經讀過他的書

我們愿用“能理能文、才華多元”來形容他。因為熱愛編程和游戲&#xff0c;所以他將愛好變成了職業&#xff0c;并在這條路上持續奔跑&#xff1b;因為熱愛分享&#xff0c;所以他堅持在博客上分享技術觀點并出版了關于 Azure、微軟游戲棧的書籍&#xff1b;因為熱愛挑戰&#…

python測試框架數據生成工具最全資源匯總

xUnit frameworks 單元測試框架frameworks 框架unittest - python自帶的單元測試庫&#xff0c;開箱即用unittest2 - 加強版的單元測試框架&#xff0c;適用于Python 2.7以及后續版本pytest - 成熟且功能強大的單元測試框架plugincompat - pytest的執行及兼容性插件nosetests -…

t30智能插座怎么設置_如何設置ConnectSense智能插座

t30智能插座怎么設置If you like the idea of smart outlets, but wish you had one with more than just one receptacle on it, the ConnectSense Smart Outlet is worth looking into. Here’s how to set it up and instantly get double the fun. 如果您喜歡智能插座的想法…

用鏈表和數組實現HASH表,幾種碰撞沖突解決方法

Hash算法中要解決一個碰撞沖突的辦法&#xff0c;后文中描述了幾種解決方法。下面代碼中用的是鏈式地址法&#xff0c;就是用鏈表和數組實現HASH表。 he/*hash table max size*/ #define HASH_TABLE_MAX_SIZE 40/*hash table大小*/ int hash_table_size0;/*.BH----------------…

安卓操作sqlite3,增刪改查

創建 layout <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layo…

基于.NetCore開發博客項目 StarBlog - (23) 文章列表接口分頁、過濾、搜索、排序

1前言上一篇留的坑&#xff0c;火速補上。在之前的第6篇中&#xff0c;已經有初步介紹&#xff0c;本文做一些補充&#xff0c;已經搞定這部分的同學可以快速跳過&#xff0c;基于.NetCore開發博客項目 StarBlog - (6) 頁面開發之博客文章列表對標準的WebApi來說&#xff0c;分…