国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

迭代是什么?

h9911 / 879人閱讀

摘要:本質上,遍歷器是一種線性處理,對于任何非線性的數據結構,部署遍歷器接口,就等于部署一種線性轉換。不過,嚴格地說,對象部署遍歷器接口并不是很必要,因為這時對象實際上被當作結構使用,沒有結構,而原生提供了。

經常看到迭代這個詞,那么歸總下吧~

什么是可迭代對象

一個對象(或它的原型鏈上的某個對象)必須有一個名字是 Symbol.iterator的屬性

String Array Map Set 是內置可迭代的對象,因為它們的原型對象都有一個 @@iterator 方法

Object 不是

接收可迭代對象的API

數組的遍歷 會調用迭代器接口,所以使用到數組作為參數的場合,都使用了遍歷器

Map([iterable]) WeakMap([iterable])

Set([iterable]) WeakSet([iterable])

Promise.all([iterable]) Promise.race([iterable])

Array.from([iterable])

for...in for...of

getOwnPropertyNames

不能用 for...in 來迭代 Set, 因為 Set 中的元素沒有 key, 使用 for...of 遍歷

迭代器 與 迭代對象的差別:

迭代器是一種特殊的對象,每一個迭代器都有一個 next(),該方法返回一個對象,包括 valuedone 屬性

    // 實現一個返回迭代器對象的函數
    function createIterator(items){
        var i = 0;
        return {
          next () {
                var done = (i >= items.length);
                var value = !done ? items[i++] : "undefined"
                return {
                    done,
                    value
                }
            }
        }
    }
    const a = createIterator([1, 2, 3]);   
    //該方法返回的最終是一個對象,包含value、done屬性。
    console.log(a.next()); //{value: 1, done: false}
    console.log(a.next()); //{value: 2, done: false}
    console.log(a.next()); //{value: 3, done: false}
    console.log(a.next()); //{value: undefined, done: true}
可迭代 和 可枚舉的差別
舉例說明不可迭代
let arrayLike = {
  0: "aa",
  1: "bb",
  2: "cc",
  length: 3
}

for (var item of arrayLike) {
  console.log(item) // TypeError: arrayLike is not iterable
}

let obj = {
  a: "monday",
  b: "sunday"
}

for (var item of obj) {
  console.log(item) // TypeError: obj is not iterable
}

上面這個例子是想遍歷一個 類數組對象 和 一個 對象, 因為它不可迭代,所以用 for...of不能遍歷
報錯TypeError: arrayLike is not iterable

但是使用 for...in 又可以遍歷了

for (var item in arrayLike) {
  console.log(item) // 0 1 2 length
}

for (var item in obj) {
  console.log(item) // a b 
}

這是為什么呢?

附上阮一峰老師的解釋

對象(Object)之所以沒有默認部署Iterator接口,是因為對象的哪個屬性先遍歷,哪個屬性后遍歷是不確定的,需要開發者手動指定。本質上,遍歷器是一種線性處理,對于任何非線性的數據結構,部署遍歷器接口,就等于部署一種線性轉換。不過,嚴格地說,對象部署遍歷器接口并不是很必要,因為這時對象實際上被當作Map結構使用,ES5沒有Map結構,而ES6原生提供了。

以及知乎上的解答為什么for...of對象不可迭代---賀師俊回調 , 寫的很棒,一下就清晰了~

// 幾種迭代方式
for (const k of Object.keys(obj)) ... // enumerable own keys
for (const [k, v] of Object.entries(obj)) ... // enumerable own [key, value]s
for (const k of Object.getOwnPropertyNames(obj)) // all own keys
for (const s of Object.getOwnPropertySymbols(obj)) // all own symbols
for (const k of Reflect.ownKeys(obj)) // all own keys (include symbols)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99322.html

相關文章

  • 什么range不迭代器?range到底什么類型?

    摘要:為什么不更規范點,令生成的是迭代器呢關于這個問題,我沒找到官方解釋,以下純屬個人觀點。類型是什么以上是我對為什么不產生迭代器的一種解答。小結回顧全文,我得到了兩個偏冷門的結論是可迭代對象而不是迭代器對象是不可變的等差序列。 showImg(https://segmentfault.com/img/bVbmKjd?w=6000&h=4000); 迭代器是 23 種設計模式中最常用的一種(...

    187J3X1 評論0 收藏0
  • 當談論迭代器時,我談些什么?

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

    王軍 評論0 收藏0
  • Python:range 對象并不迭代

    摘要:簡評迭代器是惰性可迭代對象,函數在中是一個惰性的可迭代對象,那么是不是迭代器呢為什么。如果你不能將某些東西傳遞給函數,那么它不是一個迭代器。的對象不是迭代器。 簡評:迭代器(iterator)是惰性可迭代對象(lazy iterable),range 函數在 Python 3 中是一個惰性的可迭代對象,那么 range 是不是迭代器呢?為什么。 TLNR:Python 3 中的 ran...

    draveness 評論0 收藏0

發表評論

0條評論

h9911

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<