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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Iterator:访问数据集合的统一接口

發(fā)布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Iterator:访问数据集合的统一接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

導語

遍歷器Iterator是ES6為訪問數(shù)據(jù)集合提供的統(tǒng)一接口。任何內(nèi)部部署了遍歷器接口的數(shù)據(jù)集合,對于用戶來說,都可以使用相同方式獲取到相應的數(shù)據(jù)結構。如果使用的是最新版Chrome瀏覽器,那么你要知道——我們所熟悉的數(shù)組小姐,已悄悄的打開了另一扇可抵達她心扉的小徑。

1 正題

某個數(shù)據(jù)集合部署了Iterator接口,是指其Symbol.iterator屬性指向一個能返回Iterator接口的函數(shù)。任何默認使用遍歷器訪問數(shù)據(jù)集合的方法,都會調(diào)用此屬性以得到遍歷器對象,再按照設定的順序依次訪問該數(shù)據(jù)結構的成員(關于Symbol.iterator請看最后一節(jié)的延伸閱讀)。比如原生數(shù)組的遍歷器為[][Symbol.iterator],也可以直接通過其構造函數(shù)的原型獲取Array.prototype[Symbol.iterator]。

1.1 基本行為

調(diào)用Iterator接口會返回一個新的遍歷器對象(指針對象)。
對象中必然有next方法,用于訪問下一個數(shù)據(jù)成員。指針初始時指向當前數(shù)據(jù)結構的起始位置。

第一次調(diào)用對象的next方法,指針指向數(shù)據(jù)結構的第一個成員。
第二次調(diào)用對象的next方法,指針指向數(shù)據(jù)結構的第二個成員。
不斷的調(diào)用對象的next方法,直到它指向數(shù)據(jù)結構的結束位置。

每次調(diào)用next方法,都會返回相同的數(shù)據(jù)結構:{ value, done }。
其中value表示當前指向成員的值,沒有則為undefined。
其中done是一個布爾值,表示遍歷是否結束,結束為true,否則false。

遍歷器接口的標準十分簡潔,不提供諸如:操作內(nèi)部指針、判斷是否有值等等方法。只需要一直不斷的調(diào)用next方法,當done為false時獲取當時的value,done為true時停止即可。第一次接觸遍歷器的行為模式是在2016的冬天,那時底蘊不夠雞毛也沒長全,理解不了簡潔性的適用和強大。直到現(xiàn)在——在即將打包被迫離開公司的前夕才驀然的醒覺。多么痛的領悟啊。

let iterator = [1, 2, 3][Symbol.iterator]();console.log( iterator.next() ); // {value: 1, done: false} console.log( iterator.next() ); // {value: 2, done: false} console.log( iterator.next() ); // {value: 3, done: false} console.log( iterator.next() ); // {value: undefined, done: true}

1.2 簡單實現(xiàn)

面向不同的數(shù)據(jù)結構,有不同的遍歷器實現(xiàn)方法,我們簡單的實現(xiàn)下數(shù)組的遍歷器方法。

let res = null; let iterator = myIterator([3, 7]);console.log( iterator.next() ); // {value: 3, done: false} console.log( iterator.next() ); // {value: 7, done: false} console.log( iterator.next() ); // {value: undefined, done: true}function myIterator(array = []) {let index = 0;return {next() {return index < array.length ? { value: array[index++], done: false }: { value: undefined, done: true };}}; }

1.3 return & throw

除了為遍歷器對象部署next方法,還可以有return和throw方法。其中return方法會在提前退出for of循環(huán)時(通常是因為出錯,或觸發(fā)了break語句)被調(diào)用。而throw方法主要是配合Generator函數(shù)使用,一般的遍歷器對象用不到這個方法,所以不予介紹。

let obj = {[Symbol.iterator]() {let index = 0;let array = [1, 2, 3];return {next() {return index < array.length ? { value: array[index++], done: false }: { value: undefined, done: true };},return() {console.log('Trigger return.');return {};}};} };for (let v of obj) {console.log(v); // 打印出:1, 2, 3,沒觸發(fā) return 函數(shù)。 }for (let v of obj) {if (v === 2) break;console.log(v); // 打印出:1,之后觸發(fā) return 函數(shù)。 }for (let v of obj) {if (v === 3) break;console.log(v); // 打印出:1, 2,之后觸發(fā) return 函數(shù)。 }for (let v of obj) {if (v === 4) break;console.log(v); // 打印出:1, 2, 3,沒觸發(fā) return 函數(shù)。 }for (let v of obj) {if (v === 2) throw Error('error');console.log(v); // 打印出:1,之后觸發(fā) return 函數(shù),并報錯停止執(zhí)行。 }

2 原生支持

2.1 默認持有遍歷器

原生默認持有遍歷器接口的數(shù)據(jù)結構有:
基本類型:Array, Set, Map(四種基本數(shù)據(jù)集合:Array, Object, Set 和 Map)。
類數(shù)組對象:arguments, NodeList, String。

let iterator = '123'[Symbol.iterator]();console.log( iterator.next() ); // {value: "1", done: false} console.log( iterator.next() ); // {value: "2", done: false} console.log( iterator.next() ); // {value: "3", done: false} console.log( iterator.next() ); // {value: undefined, done: true}

遍歷器與先前的遍歷方法
一個數(shù)據(jù)集合擁有遍歷器接口,并不意味著所有遍歷它的方法都是使用此接口。實際上,只有ES6新增的幾種方式和某些方法會使用,下面會有介紹。以數(shù)組來說,對其使用for和for of雖然可訪問到相同的成員,但是實際的操作方式卻不同。

// 改變數(shù)組默認的遍歷器接口。 Array.prototype[Symbol.iterator] = function () {let index = 0;let array = this;console.log('Use iterator');return {next() {return index < array.length ? { value: array[index++], done: false }: { value: undefined, done: true };}} };let arr = [1, 2];for (let v of arr) {console.log(v); // 打印出 Use iterator, 1, 2。 }for (let i = 0; i < arr.length; i++) {console.log(arr[i]); // 打印出 1, 2。 }arr.forEach(d => {console.log(d); // 打印出 1, 2。 });

對象沒有默認的遍歷器接口
為什么對象沒有默認的遍歷器接口?這要從兩方面說明。一為遍歷器是種線性處理結構,對于任何非線性的數(shù)據(jù)結構,部署了遍歷器接口,就等于部署一種線性轉(zhuǎn)換。二是對象本來就是一個無序的集合,如果希望其有序,可以使用Map代替。這即是各有其長,各安其職。屎殼郎如果不滾糞球而去采蜜,那,呃,花妹妹可能就遭殃咯。

自行生成的類數(shù)組對象(擁有l(wèi)ength屬性),不具備遍歷器接口。這與String等原生類數(shù)組對象不同,畢竟人家是親生的,一出生就含著金鑰匙(也不怕誤吞)。不過我們可以將數(shù)組的遍歷器接口直接應用于自行生成的類數(shù)組對象,簡單有效無副作用。

let obj = {0: 'a',1: 'b',length: 2,[Symbol.iterator]: Array.prototype[Symbol.iterator] };let iterator = obj[Symbol.iterator](); console.log( iterator.next() ); // {value: "a", done: false} console.log( iterator.next() ); // {value: "b", done: false} console.log( iterator.next() ); // {value: undefined, done: true}

為對象添加遍歷器接口,也不影響之前不使用遍歷器的方法,比如for in, Object.keys等等(兩者不等同)。

let obj = {0: 'a',1: 'b',length: 2,[Symbol.iterator]: Array.prototype[Symbol.iterator] };console.log( Object.keys(obj) ); // ["0", "1", "length"]for (let v of obj) {console.log(v); // 依次打印出:"a", "b"。 }for (let k in obj) {console.log(k); // 依次打印出:"0", "1", "length"。 }

2.2 默認調(diào)用遍歷器

for of
for of是專門用來消費遍歷器的,其遍歷的是鍵值(for in遍歷的是鍵名)。

for (let v of [1, 2, 3]) {console.log(v); // 依次打印出:1, 2, 3。 }

擴展運算符
無論是解構賦值或擴展運算都是默認調(diào)用遍歷器的。

let [...a] = [3, 2, 1]; // [3, 2, 1] let b = [...[3, 2, 1]]; // [3, 2, 1]

yield*
在Generator函數(shù)中有yield*命令,如果其后面跟的是一個可遍歷的結構,它會調(diào)用該結構的遍歷器接口。

for (let v of G()) {console.log(v); // 依次打印出:1, 2, 3, 4, 5 }function* G() {yield 1;yield* [2,3,4];yield 5; }

其它場合
有些接受數(shù)組作為參數(shù)的函數(shù),會默認使用數(shù)組的遍歷器接口,所以也等同于默認調(diào)用。比如Array.from(), Promise.all()。

延伸閱讀

關于ES6的Symbol:鏈接。

總結

以上是生活随笔為你收集整理的Iterator:访问数据集合的统一接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产69精品久久久久久久 | 欧美11p| 久久久久中文字幕亚洲精品 | 日韩一区二区影视 | 久久久久久久久久久丰满 | 韩国美女视频在线观看18 | 啪免费视频 | 成人亚洲电影 | 欧美熟妇交换久久久久久分类 | 亚洲人成电影网 | 国产白丝一区二区三区 | 欧洲av一区二区三区 | 香港三级日本三级韩国三级 | 中文字幕无码日韩专区免费 | 精品在线观看免费 | 久久婷香| 五月天开心激情 | 天天爽天天插 | 88av视频 | 国产不卡视频在线观看 | 伊人影视网 | 亚洲欧美日韩一区 | 国产综合婷婷 | 亚洲性事 | 亚洲精品美女在线观看 | 亚洲一区二区三区视频在线 | 日日插插 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 一二三区在线 | 亚洲乱码国产乱码精品精大量 | 巨乳动漫美女 | 一二三四区视频 | 精品香蕉99久久久久网站 | 午夜电影在线播放 | 91淫黄大片 | 国产精品免费一区 | 99精品国自产在线 | 国产精品久久久久久免费播放 | 亚洲国产网站 | 国产一级α片 | 老师张开让我了一夜av | 性欧美videos另类艳妇3d | 日韩精品一区二区电影 | 一区二区一级片 | 91亚洲国产成人精品性色 | 揄拍成人国产精品视频 | 国内精品国产成人国产三级 | 国产精品伊人久久 | 亚洲乱码电影 | 美国一级片网站 | 善良的公与媳hd中文字 | 亚洲天堂一区二区在线 | avtt亚洲| 日韩孕交| 经典三级久久 | 无码一区二区三区免费视频 | 午夜婷婷色 | 日本午夜啪啪 | 国产美女免费看 | 欧美另类高清 | 国产午夜啪啪 | 麻豆91精品 | 国产午夜久久久 | 国产视频久久 | 精品无码久久久久久久久 | 黑人一区二区三区 | 噜噜噜久久久 | 一区二区三区少妇 | 久草青青 | 淫片一级国产 | 久久综合婷婷 | 中国极品少妇xxxxx | 亚洲第一黄色网址 | avwww.| 极品美女被c | 国产又粗又长视频 | 扩阴视频 | 春宵av| 久久精品久久精品久久精品 | 久久精彩视频 | 国产婷婷一区二区三区 | 久久视频在线看 | 色二区| 国产真人无码作爱视频免费 | 伦理片久久 | 成片免费观看视频大全 | 狠狠狠| jjzz国产| 性折磨bdsm欧美激情另类 | 欧美视频在线观看一区二区 | 爱情岛论坛自拍亚洲品质极速最新章 | 看免费一级片 | 久久人妻一区二区 | av漫画在线观看 | 欧美日韩亚洲国产综合 | 精品xxxxx| 黄色网址你懂的 | 国产综合内射日韩久 | 天天综合天天添夜夜添狠狠添 |