成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

簡單學(xué)習(xí)遍歷器Iterator

Xufc / 1975人閱讀

摘要:遍歷器之后數(shù)據(jù)結(jié)構(gòu)除了數(shù)組和對象,又添加了和。遍歷器是一種接口規(guī)格,任何數(shù)據(jù)結(jié)構(gòu)只要部署這個(gè)接口,就可以完成遍歷操作提供了一個(gè)指針,通過指針的指向進(jìn)行遍歷操作它提供了一個(gè)指針,默認(rèn)指向當(dāng)前數(shù)據(jù)結(jié)構(gòu)的起始位置。

遍歷器iterator

ES6之后數(shù)據(jù)結(jié)構(gòu)除了數(shù)組和對象,又添加了Map和Set。遍歷器是一種接口規(guī)格,任何數(shù)據(jù)結(jié)構(gòu)只要部署這個(gè)接口,就可以完成遍歷操作

提供了一個(gè)指針,通過指針的指向進(jìn)行遍歷操作

它提供了一個(gè)指針,默認(rèn)指向當(dāng)前數(shù)據(jù)結(jié)構(gòu)的起始位置。也就是說,遍歷器返回一個(gè)內(nèi)部指針,
第一次調(diào)用next方法,將指針指向第一個(gè)成員,第二次調(diào)用next方法,指針指向第二個(gè)成員

下面是一個(gè)模擬遍歷器指針的例子

function makeIterator(array) {
  let nextIndex = 0
  return {
      next: function() {
          return (nextIndex < array.length) ? {value: array[nextIndex++], done: false} : {value: undefined, done: true}
      }
  }
}

let it = makeIterator(["a", "b"])
it.next() // {value: "a", done: false}
it.next() // {value: "b", done: false}
it.next() // {value: "undefined", done: false}

遍歷器是一個(gè)對象,具有next方法,調(diào)用next方法,就可以遍歷事先給定的數(shù)據(jù)結(jié)構(gòu)

Iterator接口的目的,就是為所有的數(shù)據(jù)結(jié)構(gòu)提供一種統(tǒng)一的訪問機(jī)制,就是for of循環(huán)

默認(rèn)的Iterator接口部署在數(shù)據(jù)結(jié)構(gòu)的Symbol.iterator屬性,或者說數(shù)據(jù)結(jié)構(gòu)具有該屬性就可以認(rèn)為是可遍歷的

有三類數(shù)據(jù)結(jié)構(gòu)原生具備了Iterator接口:數(shù)組、類數(shù)組對象、Set和Map,可以直接使用for of方法
而對象需要在Symbol.iterator的屬性上部署遍歷器方法,才可以for of

下面是通過遍歷器實(shí)現(xiàn)指針結(jié)構(gòu)的例子

// 在原型鏈上部署System.iterator方法,調(diào)用該方法,會(huì)返回遍歷器對象iteator。調(diào)用該對象的next方法,在返回一個(gè)值的同時(shí),自動(dòng)將內(nèi)部指針指向下一個(gè)實(shí)例
function test (value) {
    this.value = value
    this.next = null
}

test.prototype[Symbol.iterator] = function () {
    let iterator = {
        next: next // iterator.next是一個(gè)function
    }

    let current = this
    
    function next () {
        if (current) {
            let value = current.value
            let done = current == null
            current = current.next
            return {
                value: value,
                done: done
            }
        } else {
            return {
                done: true
            }
        }
    }   
    return iterator
}

let one = new test(1),
    two = new test(2),
    three = new test(3);

one.next = two
two.next = three

for (let i of one) {
    console.log(i) // 1 2 3
}

還有一種簡單操作,對于類數(shù)組對象

NodeList.prototypoe[Symbol.iterator] = Array.prototype[Symbol.iterator]

默認(rèn)調(diào)用iterator接口的場合

解構(gòu)賦值

擴(kuò)展運(yùn)算符

yield*

Arrat.from()

Map和Set

部署Symbol.iterator最簡單實(shí)現(xiàn)是結(jié)合Generator

let myIterable = []
myiIterable[Symbol.iterator] = function* () {
    yield 1
    yield 2
    yield 3
}
[...myIterable] // [1, 2, 3]

// 或者
let obj = {
    * [Symbol.iterator]() {
        yield "hello"
        yield "world"
    }
}
for (let x of obj) {
    console.log(x) // hello world
}

而對于對象來說,是不能直接使用for of的,需要使用yield包裝以下

// 以下情況報(bào)錯(cuò)
let e = {
    a: 1,
    b: "bbb"
}

for (let [key, value] of e) {
    console.log() // error,e is not iterable
}

// 使用yield包裝一下
function* (obj) {
    for (let key of Object.keys(obj)) {
        yield [key, obj[key]]
    }
}

for (let [key, value] of entries(obj)) {
    console.log(key, "->", value) 
}
// a -> 1
// b -> 2
// c -> 3

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

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88446.html

相關(guān)文章

  • 從賀老微博引出的“遍歷Iterators)加速那些奧秘”

    摘要:我關(guān)注的賀老賀師俊前輩最近發(fā)表個(gè)這樣一條微博雖然這條微博沒有引起大范圍的關(guān)注和討論,但是作為新人,我陷入了思考。通過賀老的微博,對一個(gè)問題進(jìn)行探究,最終找到核心成員的一文,進(jìn)行參考并翻譯。 我關(guān)注的賀老—賀師俊前輩@johnhax 最近發(fā)表個(gè)這樣一條微博: showImg(https://segmentfault.com/img/remote/1460000010452807); 雖然...

    XUI 評論0 收藏0
  • JavaScript 設(shè)計(jì)模式(五):迭代模式

    摘要:文章內(nèi)容分兩部分前半部分為迭代器模式概念后半部分為中迭代器上半部分開始迭代器模式提供一種方法順序訪問一個(gè)聚合對象中的各個(gè)元素,而又不需要暴露該對象的內(nèi)部表示。下半部分開始的迭代器迭代器等同于遍歷器。執(zhí)行該函數(shù),會(huì)返回一個(gè)遍歷器對象。 showImg(https://segmentfault.com/img/bVbuyaZ?w=800&h=600); 文章內(nèi)容分兩部分: 前半部分為 迭...

    zhou_you 評論0 收藏0
  • 當(dāng)談?wù)摰?em>器時(shí),我談些什么?

    摘要:示例代碼如下此示例中可以看出,當(dāng)?shù)鹘K止時(shí),通過拋出異常告知迭代器已耗盡。但如果迭代器所指向的數(shù)據(jù)結(jié)構(gòu)在其存在時(shí)發(fā)生了插入或刪除操作,則迭代器將可能失效。與的情形類似,對進(jìn)行任何插入操作也將損壞迭代器。 花下貓語:之前說過,我對于編程語言跟其它學(xué)科的融合非常感興趣,但我還說漏了一點(diǎn),就是我對于 Python 跟其它編程語言的對比學(xué)習(xí),也很感興趣。所以,我一直希望能聚集一些有其它語言基...

    王軍 評論0 收藏0
  • java的集合和泛型的知識點(diǎn)歸納1

    摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲(chǔ)元素,而主要用于迭代訪問即遍歷中的元素,因此對象也被稱為迭代器。迭代器的實(shí)現(xiàn)原理我們在之前案例已經(jīng)完成了遍歷集合的整個(gè)過程。 【Collection、泛型】 主要內(nèi)容 Collection集合 迭代器 增強(qiáng)for 泛型 教學(xué)目標(biāo) [ ] 能夠說出集合與數(shù)組的區(qū)別 [ ] 說出Collection集合的常用功能 [ ]...

    daryl 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<