摘要:什么是可迭代對象可迭代對象具有屬性是一個方法的返回值是一個迭代器結合以上第二點和第三點,可以得出就是一個生成器所以我們可以給出一個可迭代對象的明確定義就是一個具有屬性,且其為一個生成器的對象,就是可迭代對象。
1: 什么是可迭代對象?
1: 可迭代對象具有Symbol.iterator屬性 2: Symbol.iterator是一個方法 3: Symbol.iterator的返回值是一個迭代器 4: 結合以上第二點和第三點,可以得出Symbol.iterator就是一個生成器
所以我們可以給出一個可迭代對象的明確定義就是:一個具有Symbol.iterator屬性,且其為一個生成器的對象,就是可迭代對象。
2: 如何創建一個可迭代對象?
有了上面的第一點的定義,我們就可以創建出一個可迭代對象,如下:
let myIteratorObject = { items: [], *[Symbol.iterator](){ for(let item of this.items){ yield item; } } }; myIteratorObject.items = [1, 2, 3]; for(let item of myIteratorObject){ console.log(item);//依次得到1, 2, 3 }
3: ES6默認的可迭代對象有哪些?
從前面的內容我們知道,并不是所有的對象都是可迭代對象,我們自己創建的對象,必須要手動添加*[Symbol.iterator]這個生成器才行。但是ES6內建的對象,有一些默認就是可迭代對象,毋需我們再做額外的工作。它們就是以下這些:
1: 數組Array 2: Set 3: Map 4: 字符串String 5: NodeList(準確說來是定義在DOM標準中)
4: 集合對象(Array, Set, Map)的內建迭代器有幾種?
從上面的第三點我們知道Array, Set, Map它們默認就是可迭代對象,這說明它們默認就有迭代器。而這三個集合對象,不僅有默認迭代器,而且還不止1個,有3個:
1: entries() 返回一個迭代器,其值為多個鍵值對 2: values() 返回一個迭代器,其值為集合的值 3: keys() 返回一個迭代器,其值為集合中的所有鍵名
下面通過代碼來來看一下使用這三種不同的集合所對應的三種不同的迭代器得到的數據是什么:
let array = [1, 2, 3]; let set = new Set(["a", "b", "c"]); let map = new Map(); map.set("name", "apple"); map.set("price", 20); //entries() for (let item of array.entries()) { console.log(item); } for (let item of set.entries()) { console.log(item); } for (let item of map.entries()) { console.log(item); } //values() for(let item of array.values()){ console.log(item); } for(let item of set.values()){ console.log(item); } for(let item of map.values()){ console.log(item); } //keys() for(let item of array.keys()){ console.log(item); } for(let item of set.keys()){ console.log(item); } for(let item of map.keys()){ console.log(item); }
entries()
[0, 1] [1, 2] [2, 3] ["a", "a"] ["b", "b"] ["c", "c"] ["name", "apple"] ["price", 20]
values()
1 2 3 a b c apple 20
keys()
0 1 2 a b c name price
從以上結果我們看出,
1: 對于Array來說,會把元素下標作為每一個“鍵值對”的key; 2: 對于Set來說,集合元素本身既是key,又是value; 3: Map就是最標準的key就是key,value就是value啦。
5: 集合對象的默認迭代器是什么?
從上面的第4點我們知道了,Array,Set,Map這三種集合對象都內建了三種不同的迭代器,但是如果當我們在使用for...of的時候,不是十分確定地指定某一種迭代器,那這三個對象會默認使用哪個呢?
let array = [1, 2, 3]; let set = new Set(["a", "b", "c"]); let map = new Map(); map.set("name", "apple"); map.set("price", 20); for(let item of array){ console.log(item); } for(let item of set){ console.log(item); } for(let item of map){ console.log(item); }
我們會得到以下結果:
1 2 3 a b c ["name", "apple"] ["price", 20]
所以結論就是:
1: Array的默認迭代器是values() 2: Set的默認迭代器是values() 3: Map的默認迭代器是entries()
6: 可迭代對象的初級使用場景
1:用于for...of 2:用于展開運算符...
for...of和展開運算符都要求作用的對象是可迭代對象。for...of我們就不再贅述,前面的例子里面已經有用到;接下來看一下展開運算符的代碼示例:
let map = new Map([["name", "apple"],["price", 20]]); let array = [...map]; for(let item of array){ console.log(item) }
得到結果:
["name", "apple"],?["price", 20]
以上我們通過for...of迭代array的元素,得到兩個一維數組,由此可知array本身是一個二維數組:[["name", "apple"],["price", 20]],也就是和傳給new Map()的參數的數組一樣。這是因為展開運算符會使用作用對象的默認迭代器(對于Map來說,就是多對鍵值對)然后,把這些鍵值對,依次放入數組中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110257.html
摘要:引用自可迭代對象和迭代器不以規矩,不成方圓為了使某個對象成為可迭代對象象,它必須實現方法,也就是說,它得有一個是的屬性。的遍歷,絕對應該用。 pseudo 英 [sju:d??] 美 [su:do?]adj.假的,虛偽的n.[口]假冒的人,偽君子 pseudo-array 英 [sju:d???re?] 美 [sju:d???re?][計] 偽數組 jQuery 對象是偽數組 兩個...
摘要:可迭代對象就具有屬性,它是一種與迭代器密切相關的對象。它通過指定的函數可以返回一個作用于附屬對象的迭代器。迭代器特點每次調用方法時,返回一個數組,數組中兩個元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點返回集合中存在的每一個鍵。 Iterator由來 不推薦Iterator方法。 Iterator 函數是一個 SpiderMonkey 專有特性,并且會在某一時刻被刪除。有一點,需...
摘要:我個人認為迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。 我個人認為迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。話不多說,先來了解一下基本概念:一:什么是迭代器 1: 迭代器是一個對象 2: 迭代器有一個屬性...
摘要:迭代器是一種特殊對象,每一個迭代器對象都有一個,該方法返回一個對象,包括和屬性。默認情況下定義的對象是不可迭代的,但是可以通過創建迭代器。在迭代器中拋出錯誤不再執行生成器返回語句生成器中添加表示退出操作。迭代器是一個對象。 迭代器(Iterator) ES5實現迭代器 迭代器是什么?遇到這種新的概念,莫慌張。 迭代器是一種特殊對象,每一個迭代器對象都有一個next(),該方法返回一個對...
閱讀 683·2021-11-22 09:34
閱讀 3821·2021-09-22 15:42
閱讀 1327·2021-09-03 10:28
閱讀 1071·2021-08-26 14:13
閱讀 1901·2019-08-29 15:41
閱讀 1419·2019-08-29 14:12
閱讀 3361·2019-08-26 18:36
閱讀 3307·2019-08-26 13:47