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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第十四节:ES6的 Iterator 遍历器到底是什么?

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十四节:ES6的 Iterator 遍历器到底是什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????對一個事物足夠熱愛,才會有這樣的熱情...


????????

????????沖著這位同學的學習熱情,前端君今晚就給大家再來一發。

for...of為啥不遍歷Object對象

????????第十三節我們講了簡單又實用的for...of,我們可以使用它來遍歷數組,字符串,Set和Map結構,但是有沒有發現,我們并沒有說它可以遍歷Object對象,為什么不試試用它來遍歷Object對象呢?

????????我們試試看:

????//定義一個的Object對象
????let obj = {"name":"前端君"};

????//咱們來for...of一下
????for(let v of obj){
??????? console.log(v);
????}
????//結果:報錯
????//錯誤提示:obj[Symbol.iterator]不是一個function

????????oh no,程序報錯了,for...of根本不支持遍歷普通的Object對象,還出現了錯誤提示:obj[Symbol.iterator]不是一個function,這是什么鬼?

????????為什么數組,Set和Map結構又可以支持for...of的遍歷呢?

????????原來,要想能夠被for...of正常遍歷的,都需要實現一個遍歷器Iterator。而數組,Set和Map結構,早就內置好了遍歷器Iterator(又叫迭代器),它們的原型中都有一個Symbol.iterator方法;而Object對象并沒有實現這個接口,使得它無法被for...of遍歷。

?

????????那么,我們就親自來驗證一下,它們的原型中到底是不是有個叫Symbol.iterator的方法:

? ?
? ?//數組
? ?Array.prototype[Symbol.iterator];
? ?//結果:function values(){...}

? ?//字符串
? ?String.prototype[Symbol.iterator];
? ?//結果:function [Symbol.iterator](){...}

? ?//Set結構
? ?Set.prototype[Symbol.iterator];
? ?//結果:function values(){...}

? ?//Map結構
? ?Map.prototype[Symbol.iterator];
? ?//結果:function entries(){...}

? ?//Object對象
? ?Object.prototype[Symbol.iterator];
? ?//結果:undefined

????????從上往下看,確實,唯獨Object對象的原型上沒有Symbol.iterator,返回了:undefined。其他的數據類型的原型上都含有一個名字叫Symbol.iterator的方法Function。

????????注意:Symbol.iterator 是Symbol 對象的 iterator 屬性,是一個特殊的Symbol值,因此,當它作為prototype對象屬性名的時候,獲取它的時候需要使用[ ]的形式: prototype[Symbol.iterator],不能使用點形式獲取:prototype.Symbol.iterator。原因是點形式會把后面的值當作是字符串類型處理,而不是Symbol類型。第十一節有介紹,點擊查看。

?

????????也就說,只要一個數據結構擁有一個叫[Symbol.iterator]()方法的數據結構,就可以被for...of遍歷,我們稱之為:可遍歷對象。比如:數組,字符串,Set和Map結構。

?

????????現在你該知道為什么文章第一個案例會出現錯誤提示:obj[Symbol.iterator]不是一個function 了吧,因為Object對象的原型上壓根就沒有[Symbol.iterator]() 方法啊。還打算報警嗎?


????????既然我們知道擁有[Symbol.iterator]()方法就可以被遍歷,我們就會好奇:[Symbol.iterator]方法到底做了什么這么牛逼,它的原理是什么??

Iterator遍歷器的原理

????????

????????當可遍歷對象被for...of遍歷的時候,[Symbol.iterator]()就會被調用,返回一個iterator對象。其中還有一個很重要的方法:next( );


? ?//數組:一個可遍歷對象
? ?let arr = ['a','b','c'];
? ?//調用數組的Symbol.iterator()方法
? ?let iter = arr[Symbol.iterator]();


? ?iter.next();
? ?//結果:{value: "a", done: false}

? ?iter.next();
? ?//結果:{value: "b", done: false}

? ?iter.next();
? ?//結果:{value: "c", done: false}

? ?iter.next();
? ?//結果:{value: undefined, done: true}

????????第1次調用next( )方法:返回數組的第1個元素:“a”,以及done的值為fasle,表示循環沒有結束,繼續遍歷。

?

????????第2次調用next( )方法:返回數組的第2個元素:“b”,以及done的值還是為fasle,表示循環沒有結束,繼續遍歷。

????????第3次調用next( )方法:返回數組的第3個元素:“c”,以及done的值依然為fasle,表示循環沒有結束,繼續遍歷。

?

????????第4次調用next( )方法:返回的value值為undefined,以及done的值變成了true,表示遍歷結束。

?

????????原來,for...of的原理就是:先調用可遍歷對象的[Symbol.iterator]( )方法,得到一個iterator遍歷器對象,然后就在遍歷器上不斷調用next( )方法,直到done的值為true的時候,就表示遍歷完成結束了

?

自定義Iterator遍歷器

???

????????既然有了[Symbol.iterator]()方法就算是可遍歷對象,那么我給Object對象手動加上一個[Symbol.iterator]()方法,那么它是不是可以被for...of遍歷了?



????????那我們就試試看,給一個Object對象加一個[Symbol.iterator]( )方法,看它是不是就能被for...of遍歷了?


? ?//定義一個的Object對象
? ?let obj = {
?? ? ?? 0:"我是0",
?? ? ?? 1:"我是1",
??? ? ? 2:"我是2",
??? ? ? length:3,
??? ? ? //添加[Symbol.iterator]方法
? ? ? ?[Symbol.iterator] : function() {
????? ? ??? let _this = this;
????? ? ??? let index = 0;
????? ? ??? return {
?????? ? ?????? next:() => {
???????? ? ???????? let value = _this[index];
??????? ? ????????? let done = (index >= _this.length);
????????????? ? ? ??index++;
????????????? ? ??? return {value,done}
? ????????? ? ??}
??????? ? ? }
??? ? ? }
? ?};

? ?//咱們來for...of一下
? ?for(let v of obj){
??? ? ? console.log(v);
? ?}
? ?//結果:"我是0"
? ?//????? "我是1"
? ?//????? "我是2"

????????上面這個案例也許你看了覺得很復雜,沒看懂,沒關系,我一起來分析它的結構就夠了!

????????我們定義了一個Object對象,同時給它添加了[Symbol.iterator]()方法,并在[Symbol.iterator]()方法實現了next( )方法,next( )方法返回的對象包含了value屬性和done屬性。

????????具體細節如果不理解沒關系,我們確實看到了給Object對象加上了[Symbol.iterator]()方法后,最后確實能被for...of遍歷了。

????????這就是說,我們可以創建一個可遍歷的對象,并且自定義它的遍歷行為。或者說可以通過添加[Symbol.iterator]()方法,把一個不可遍歷的Object對象,變成可遍歷的對象。

Iterator遍歷器的價值?

????????

????????新特性for...of之所以能夠遍歷各種不同的數據結構,正是因為這個數據結構都實現了Iterator遍歷器接口,供for...of遍歷。如果沒有實現Iterator接口,則該數據結構無法被for...of遍歷,比如:普通的Object對象。

?

本節小結

總結:Iterator遍歷器為各種數據結構提供一個統一的遍歷接口,使得for...of能夠輕松簡便地訪問數據成員。 數據結構實現了Iterator接口,我們稱之為可遍歷對象。我們也可以自己創建可遍歷對象并自定義遍歷行為。

總結

以上是生活随笔為你收集整理的第十四节:ES6的 Iterator 遍历器到底是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久久久久久久久久av | 亚洲一区二区三区久久久成人动漫 | wwwxx国产| 欧美xxxxx牲另类人与 | 天天插天天搞 | 折磨小男生性器羞耻的故事 | 中文字幕在线一 | 黑人操少妇 | 波多野吉衣一区二区 | 老司机深夜福利网站 | 国产成人av片 | 一卡二卡久久 | 中文字幕一区二区三区人妻四季 | 久一国产| 亚欧洲精品在线视频免费观看 | 久久久久久久久久久福利 | 人妻在线一区 | 最新福利视频 | 国产二页| 免费荫蒂添的好舒服视频 | 黄色你懂的| 免费在线播放毛片 | 亚洲a成人| 国产一区二区三区色淫影院 | 韩国一级淫片免费看 | 欧洲av在线播放 | 国产精品av在线播放 | 99热热热热| 久久久www成人免费毛片 | 日韩视频免费在线观看 | 欧美成人久久久 | 91丝袜在线观看 | 国产 第1190页 | 亚洲不卡在线视频 | 在线观看免费黄色 | 国产精品日日夜夜 | 欧美天堂在线 | 亚洲欧洲国产综合 | 欧美做爰猛烈床戏大尺度 | 亚洲狼人色 | 苍井空浴缸大战猛男120分钟 | 爱情岛亚洲首页论坛小巨 | 中文字幕一区二区三区乱码不卡 | 九九免费 | 午夜激情免费 | 中文字幕av第一页 | av在线一区二区三区 | 国产精品wwww | 久草精品在线 | a亚洲精品 | 欧美大片高清免费观看 | 亚洲男人天堂视频 | 一级片欧美 | 国产精品--色哟哟 | 欧美日韩一区二区久久 | 亚洲欧美日韩久久精品 | 亚洲天堂影视 | 精品午夜福利在线观看 | 色婷婷av一区二区三区gif | 亚洲成人黄色网址 | 亚洲午夜精品久久久久久app | 大陆熟妇丰满多毛xxxⅹ | 久久久久久无码精品人妻一区二区 | 成人激情自拍 | missav|免费高清av在线看 | 91色拍 | 日韩精品在线免费观看 | 亚洲视频在线观看网站 | 大肉大捧一进一出好爽mba | 国产欧美日韩综合精品一区二区 | 国产a级片免费看 | 日日操夜夜草 | 亚洲色图.com| 日本网站在线播放 | 天天综合网在线 | 高清欧美性猛交xxxx | 欧美日韩免费观看视频 | 日操操 | 人人艹视频 | 99re只有精品 | 精品在线观看一区二区 | 久草麻豆 | 在线视频中文字幕 | 国产午夜网站 | 成人区人妻精品一区二区网站 | 国产熟女一区二区 | 91精品国产成人观看 | 亚洲老老头同性老头交j | 日本丰满熟妇videossex一 | 日本在线不卡一区二区三区 | 肥熟女一区二区三肥熟女 | 午夜精品视频在线观看 | 午夜污污| 久久亚洲精精品中文字幕早川悠里 | 国产精品网站免费 | 天天狠天天干 | 日本裸体视频 | 欧美日韩性 | 男女扒开双腿猛进入爽爽免费 |