国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JS - iterator(迭代器)

這篇具有很好參考價值的文章主要介紹了JS - iterator(迭代器)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、 概念

? ? ? ?JavaScript原有表示“集合”的數(shù)據(jù)結(jié)構(gòu),主要是數(shù)組(' Array ')和對象('?Object ' ),ES6又添加了Map和Set。這樣就有了四種數(shù)據(jù)集合,用戶還可以組合使用它們,定義自己的數(shù)據(jù)結(jié)構(gòu),比如數(shù)組的成員是Map,Map的成員是對象。這樣就需要一種統(tǒng)一的接口機制,來處理不同的數(shù)據(jù)結(jié)構(gòu)。
? ? ? ?遍歷器(Iterator)就是這樣一種機制。它是一種接口,為不同的數(shù)據(jù)結(jié)構(gòu)提供一種訪問機制,即for ... of 循環(huán)。當使用for...of循環(huán)遍歷某種數(shù)據(jù)結(jié)構(gòu)時,該循環(huán)會自動去尋找 Iterator 接口。任何數(shù)據(jù)結(jié)構(gòu)只要部署Iterator接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié)構(gòu)的所有成員)。

二、本質(zhì)?

? ? ? ? 迭代器對象本質(zhì)上,就是一個指針對象。通過指針對象的next(), 用來移動指針。
? ? ? ?
迭代器協(xié)議:對象必須提供一個next(),執(zhí)行該方法要么返回迭代的下一項,要么就引起Stopiteration異常,以終止迭代。
? ? ? ? 每調(diào)用一次next ()方法,都會返回一個對象,都會返回數(shù)據(jù)結(jié)構(gòu)的當前成員的信息。這個對象有 value 和 done 兩個屬性,value屬性返回當前位置的成員,done屬性是一個布爾值,表示遍歷是否結(jié)束,即是否有必要再調(diào)用一次next () 。對于遍歷器來說,value:undefined和done:false屬性都是可以省略的。
? ? ? ??
ES6 規(guī)定,默認的 Iterator 接口部署在數(shù)據(jù)結(jié)構(gòu)的Symbol.iterator屬性上;或者說,一個數(shù)據(jù)結(jié)構(gòu)只要有Symbol.iterator屬性,就認為是可遍歷的。

三、實現(xiàn)Iterator接口的原生對象

原生具備Iterator接口的數(shù)據(jù)結(jié)構(gòu)有:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函數(shù)的 arguments 對象
  • NodeList 對象

?可以看到Array原型對象已經(jīng)實現(xiàn)了Iterator這個屬性:
JS - iterator(迭代器)

?那么數(shù)組的實例對象也擁有這個屬性,可以調(diào)用試試:
JS - iterator(迭代器)

下面是模擬next()方法返回的例子:
JS - iterator(迭代器)

? ? ? ?上面的代碼定義了一個makeIterator函數(shù),它是一個遍歷器生成的函數(shù),作用就是返回一個遍歷器對象。對數(shù)組[ ’a', 'b' ]執(zhí)行這個函數(shù),就會返回該數(shù)組的遍歷器對象(指針對象)it。指針對象的next方法,用來移動指針。開始時,指針指向數(shù)組的開始位置。然后,每次調(diào)用next方法,指針就會指向數(shù)組的下一個成員。第一次調(diào)用,指向a;第二次調(diào)用,指向b。
? ? ? ??總之,調(diào)用指針對象的next()方法,就可以遍歷事先給定的數(shù)據(jù)結(jié)構(gòu)。
? ? ? ? 上面說了,對于遍歷器對象來說, done:false 和 value:undefined屬性都是可以省略的,因此上面的makeIterator函數(shù)可以簡寫成下面的形式。
JS - iterator(迭代器)

?使用場合:

①?對實現(xiàn)了Iterator接口的數(shù)據(jù)解構(gòu)賦值

JS - iterator(迭代器)

?② 擴展運算符

JS - iterator(迭代器)

上面代碼的擴展運算符內(nèi)部就調(diào)用 Iterator 接口。

實際上,這提供了一種簡便機制,可以將任何部署了 Iterator 接口的數(shù)據(jù)結(jié)構(gòu),轉(zhuǎn)為數(shù)組。也就是說,只要某個數(shù)據(jù)結(jié)構(gòu)部署了 Iterator 接口,就可以對它使用擴展運算符,將其轉(zhuǎn)為數(shù)組。

三、 for... of 循環(huán)

for...of循環(huán)可以使用的范圍包括數(shù)組、Set 和 Map 結(jié)構(gòu)、某些類似數(shù)組的對象(比如arguments對象、DOM NodeList 對象)、字符串等。

數(shù)組原生具備iterator接口,(默認部署Symbol.iterator屬性),for...of 循環(huán)本質(zhì)上就是調(diào)用這個接口產(chǎn)生的遍歷器:

const arr = ['red', 'green', 'blue'];

for(let v of arr) {
  console.log(v); // red green blue
}

const obj = {};
obj[Symbol.iterator] = arr[Symbol.iterator].bind(arr);

for(let v of obj) {
  console.log(v); // red green blue
}

上面代碼中,空對象obj部署了數(shù)組arrSymbol.iterator屬性,結(jié)果objfor...of循環(huán),產(chǎn)生了與arr完全一樣的結(jié)果。

for ... of 循環(huán)可以代替數(shù)組實例 forEach 方法。

const arr = ['red', 'green', 'blue'];

arr.forEach(function (element, index) {
  console.log(element); // red green blue
  console.log(index);   // 0 1 2
});

JavaScript 原有的for...in循環(huán),只能獲得對象的鍵名,不能直接獲取鍵值。ES6 提供for...of循環(huán),允許遍歷獲得鍵值。

var arr = ['a', 'b', 'c', 'd'];

for (let a in arr) {
  console.log(a); // 0 1 2 3
}

for (let a of arr) {
  console.log(a); // a b c d
}

四、 Set 和 Map結(jié)構(gòu)

Set和Map結(jié)構(gòu)也原生具有Interator接口,可以直接使用for...of循環(huán)。

var engines = new Set(['1','2','3']);
for (var e of engines) {
  console.log(e);   // 1  2  3
} 

var class = new Map();
class .set('Tom', 12);
class .set('Lala', 13);
class .set('9300', 14);
for (var [name,value] of class) {
  console.log(name + ':' + number);    // Tom:12  Lala:13  9300:14
}     

以上代碼演示了如何遍歷Set和Map結(jié)構(gòu)。需要注意的是,首先遍歷的順序是按照哥哥成員被添加進數(shù)據(jù)結(jié)構(gòu)的順序。其次,Set結(jié)構(gòu)遍歷時,返回的是一個值。而Map結(jié)構(gòu)遍歷時,返回的是一個數(shù)組,該數(shù)組的兩個成員分別是當前Map成員的鍵名和鍵值。

let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
  console.log(pair);
}
// ['a', 1]
// ['b', 2]

for (let [key, value] of map) {
  console.log(key + ' : ' + value);
}
// a : 1
// b : 2

其他內(nèi)容可參照?ES6入門文章來源地址http://www.zghlxwxcb.cn/news/detail-469555.html

到了這里,關(guān)于JS - iterator(迭代器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • <Java Iterator> 迭代器Iterator雙層循環(huán)

    案例分享: 測試輸出:

    2024年02月15日
    瀏覽(24)
  • <Java Iterator> 迭代器Iterator雙層循環(huán) 案例分享

    需求: 需要一個按鈕,每次執(zhí)行的時候,調(diào)接口刷新數(shù)據(jù)庫表中的數(shù)據(jù): 刷新條件: 如果接口獲取的數(shù)據(jù)和數(shù)據(jù)庫表的數(shù)據(jù)完全一致則不刷新,如果不一致,則新增數(shù)據(jù);

    2024年02月15日
    瀏覽(51)
  • C++迭代器(STL迭代器)iterator詳解

    C++迭代器(STL迭代器)iterator詳解

    要訪問順序容器和關(guān)聯(lián)容器中的元素,需要通過“迭代器(iterator)”進行。迭代器是一個變量,相當于容器和操縱容器的算法之間的中介。迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。從這一點上看,迭代器和指針類似。 迭代器按照定義方式分

    2024年02月03日
    瀏覽(22)
  • 迭代器 Iterator

    迭代器是一種設(shè)計模式,它用于遍歷集合或容器中的元素,能夠訪問集合的元素而無需關(guān)心集合的內(nèi)部結(jié)構(gòu): 特點: 封裝集合訪問 :迭代器封裝了對集合元素的訪問,通過迭代器訪問集合中的元素,而無需了解集合的內(nèi)部結(jié)構(gòu)或?qū)崿F(xiàn)方式。 統(tǒng)一接口 :迭代器提供了一致的

    2024年02月08日
    瀏覽(20)
  • Python迭代器(Iterator)

    迭代是訪問集合元素的一種方式 迭代器是一個可以記住遍歷位置的對象。迭代器對象從第一個元素開始訪問,直到所有的元素被訪問結(jié)束。迭代器只能往前不會后退。 能用for循環(huán)遍歷的對象 for循環(huán)的過程可以通過上面的iter()和next()函數(shù)來實現(xiàn),即: 1、先調(diào)用iter(),將nums當

    2024年02月15日
    瀏覽(20)
  • 迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern)

    一、定義 提供一種方法順序訪問一個聚合對象中各個元素,而又不需要暴露該對象的內(nèi)部表示。 二、優(yōu)缺點 優(yōu)點: ?1、它支持以不同的方式遍歷一個聚合對象。 2、迭代器簡化了聚合類。 3、在同一個聚合上可以有多個遍歷。 4、在迭代器模式中,增加新的聚合類和迭代器類

    2024年02月09日
    瀏覽(22)
  • 遞歸(recurse)與迭代(iteration)

    遞歸(recurse)與迭代(iteration)

    遞歸,在數(shù)學(xué)與計算機科學(xué)中,是指在方法的定義中使用方法自身。也就是說,遞歸算法是一種 直接或者間接調(diào)用自身方法 的算法。簡言之:在定義自身的同時又出現(xiàn)自身的直接或間接調(diào)用。 注意: 遞歸必須要有一個退出的條件! 遞歸算法解決問題的特點: 1)遞歸就是方

    2024年02月10日
    瀏覽(23)
  • Python——迭代器(可迭代、可迭代對象、迭代器、遍歷本質(zhì)、iter函數(shù)、next函數(shù)、__iter__方法、__next__方法、自定義可迭代對象與自定義迭代器、for循環(huán)本質(zhì))

    迭代(iter) 我們經(jīng)常聽說過\\\"版本迭代\\\"這個詞,意思是在原來版本的基礎(chǔ)上,再提升一個版本的過程。那么我們僅僅看看\\\"迭代\\\"這個詞,會發(fā)現(xiàn)迭代就是一個根據(jù)原來的狀態(tài)決定本次狀態(tài)的過程 迭代應(yīng)用于Python中,迭代具體是指根據(jù)原來的數(shù)據(jù)輸出(并不一定是要打印,也可

    2024年02月04日
    瀏覽(23)
  • 無涯教程-Lua - Iterators(迭代器)

    迭代器是一種構(gòu)造,使您可以遍歷所謂的集合或集合的元素。在Lua中,這些集合通常引用表,這些表用于創(chuàng)建各種數(shù)據(jù)結(jié)構(gòu)(如數(shù)組)。 通用的 for 迭代器提供集合中每個元素的鍵值對。下面給出一個簡單的示例。 當無涯教程運行上面的代碼時,將獲得以下輸出- 上面的示例使

    2024年02月14日
    瀏覽(44)
  • 【Java雜談】Iterator(迭代器)的使用

    【Java雜談】Iterator(迭代器)的使用

    迭代器是Java提供的一種訪問集合的方法,Iterator 是 Java 迭代器最簡單的實現(xiàn),常用來訪問ArrayList、HashMap等類的對象。 Iterator是一個接口,ListIterator是Collection API中的接口,它擴展了Iterator接口: 可以使用iterator() 方法: hasNext()方法的作用是沒有遍歷完成 next()方法有兩個作用

    2024年02月10日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包