摘要:就稱為部署了遍歷器接口。是一個函數,調用它會生成一個遍歷器對象。它的屬性,也是一個遍歷器對象生成函數,執行后返回它自己。返回遍歷器對象。下面是一個無限運行的遍歷器對象的例子。
『ES6知識點總結』遍歷器iterator
本文內容如下:
1 具有iterator接口的數據結構 2 遍歷器過程 3 遍歷器作用: 4 模擬next()方法 5 使用while循環 6 TypeScript的寫法 7 Iterator接口與Generator函數 8 對象的遍歷器接口 8.1 對于類似數組的對象 9 調用Iterator接口的場合 9.1 解構賦值 9.2 擴展運算符 9.3 yield* 9.4 其他場合 10 字符串的Iterator接口具有iterator接口的數據結構
【01】原生就具有Iterator接口,它們的遍歷器接口部署在Symbol.iterator屬性上:
Array,Object(類數組對象),Map,WeakMap,Set,WeakSet,字符串。
let arr = new Array();
let iterator =arr[Symbol.iterator]();
【02】其他數據結構(主要是對象)的Iterator接口,都需要自己部署在Symbol.iterator屬性上面。(原型鏈上的對象具有該方法也可)。
【03】一個數據結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”(iterable)。
就稱為部署了遍歷器接口。就可以遍歷所有成員。可通過for of 遍歷。
【04】遍歷器對象本身也有Symbol.iterator方法,執行后返回自身。
gen是一個Generator函數,調用它會生成一個遍歷器對象g。它的Symbol.iterator屬性,也是一個遍歷器對象生成函數,執行后返回它自己。
function* gen(){ // some code } var g = gen(); g[Symbol.iterator]() === g // true遍歷器過程
【01】zyx456:說白了,等于這些數據結構有一個方法(PS,這個方法稱為遍歷器函數)。
方法名是[Symbol.iterator],方法中返回一個對象(PS,這個對象稱為遍歷器對象),該對象有一個next()方法。這個next()會遍歷數據結構的成員。返回{value:XX||undefined , done:true||false}
let obj = {
? [Symbo.iterator] (){
return {next(){}}
}
}
調用遍歷器函數,就會返回一個遍歷器對象。
每次調用iterator.next(),就使用該數據結構的一個成員,成員的值就是返回對象中value的值。done為false,最后會返回一個有value和done兩個屬性的對象。
從頭到尾依次使用數據結構的成員。直到使用的成員都訪問完了。
當數據結構的成員已全部訪問了,此時,再調用iterator.next()。返回的對象中,value的值為undefined,done為true。
done屬性是一個布爾值,表示遍歷是否結束。
let arr = [1,2,3];
let iterator = arr[Symbol.iterator]();
iterator.next();//{value:"",done:false};
let arr = ["a", "b", "c"]; let iter = arr[Symbol.iterator]();//返回遍歷器對象。 iter.next() // { value: "a", done: false } iter.next() // { value: "b", done: false } iter.next() // { value: "c", done: false } iter.next() // { value: undefined, done: true }
【03】遍歷器與它所遍歷的那個數據結構是分開的。
遍歷器作用:一是為各種數據結構提供一個統一的訪問接口;
二是讓數據結構的成員可以按某種次序排列;
三是供for...of使用。
模擬next()方法使用一個函數,函數參數是數組,返回一個對象,對象具有next()方法。
在next()中,使用一個變量,遍歷數組的下標。通過和數組的長度對比,來判斷返回不同的對象。
返回對象都有value和done屬性。
function Convert(arr){ let index = 0; return { next (){ if(indexzyx456:next返回的就是指針對象了。此時,it是對象,它的變量index是保存在函數中的。
對于遍歷器對象來說,done: false和value: undefined屬性都是可以省略的,因此上面的Covert函數可以簡寫成下面的形式。
function Covert(array) { var nextIndex = 0; return { next: function() { return nextIndex < array.length ? { value: array[nextIndex++] } : { done: true }; } } }【】下面是一個無限運行的遍歷器對象的例子。
zyx456:僅了解。實用性不大。
遍歷器生成函數idMaker,返回一個遍歷器對象(即指針對象)。但是并沒有對應的數據結構,或者說,遍歷器對象自己描述了一個數據結構出來。
function idMaker() { let index = 0; return { next: function() { return { value: index++, done: false }; } } }var it = idMaker(); it.next().value // "0" it.next().value // "1" it.next().value // "2" // ...使用while循環有了遍歷器接口,數據結構就可以用for...of循環遍歷,也可以使用while循環遍歷。
var $iterator = ITERABLE[Symbol.iterator](); var $result = $iterator.next(); while (!$result.done) { var x = $result.value; // ... $result = $iterator.next(); }TypeScript的寫法遍歷器接口(Iterable)、指針對象(Iterator)和next方法返回值的規格可以描述如下。
interface Iterable { [Symbol.iterator](): Iterator, } interface Iterator { next(value ? : any): IterationResult, } interface IterationResult { value: any, done: boolean, }Iterator接口與Generator函數var myIterable = {}; myIterable[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對象的遍歷器接口【】對象部署遍歷器接口并不是很必要,可以使用Map。
對于類似數組的對象(存在數值鍵名和length屬性),部署Iterator接口,有一個簡便方法,就是Symbol.iterator方法直接引用數組的Iterator接口。
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]; // 或者 NodeList.prototype[Symbol.iterator] = [][Symbol.iterator]; [...document.querySelectorAll("div")] // 可以執行了下面是類似數組的對象調用數組的Symbol.iterator方法的例子。
let iterable = { 0: "a", 1: "b", 2: "c", length: 3, [Symbol.iterator]: Array.prototype[Symbol.iterator] }; for (let item of iterable) { console.log(item); // "a", "b", "c" }調用Iterator接口的場合有一些場合會默認調用Iterator接口(即Symbol.iterator方法)。
解構賦值對數組和Set結構進行解構賦值時,會默認調用Symbol.iterator方法。
let set = new Set().add("a").add("b").add("c"); let [x, y] = set; // x="a"; y="b" let [first, ...rest] = set; // first="a"; rest=["b","c"];擴展運算符擴展運算符(...)會內部調用默認的iterator接口。
可以將任何部署了Iterator接口的數據結構,轉為數組。
// 例一 var str = "hello"; [...str] // ["h","e","l","l","o"] // 例二 let arr = ["b", "c"]; ["a", ...arr, "d"] // ["a", "b", "c", "d"]let arr = [...iterable];yield*yield*后面跟的是一個可遍歷的結構,它會調用該結構的遍歷器接口。
let generator = function* () { yield 1; yield* [2,3,4]; yield 5;};var iterator = generator(); iterator.next() // { value: 1, done: false } iterator.next() // { value: 2, done: false } iterator.next() // { value: 3, done: false } iterator.next() // { value: 4, done: false } iterator.next() // { value: 5, done: false } iterator.next() // { value: undefined, done: true }其他場合由于數組的遍歷會調用遍歷器接口,所以任何接受數組作為參數的場合,其實都調用了遍歷器接口。
下面是一些例子。
for...of
Array.from()
Map(), Set(), WeakMap(), WeakSet()(比如new Map([["a",1],["b",2]]))
Promise.all([])
Promise.race([])
字符串的Iterator接口字符串是一個類似數組的對象,原生具有Iterator接口。
var someString = "hi"; typeof someString[Symbol.iterator] // "function" var iterator = someString[Symbol.iterator](); iterator.toString(); // => "[object String Iterator]" iterator.next() // { value: "h", done: false } iterator.next() // { value: "i", done: false } iterator.next() // { value: undefined, done: true }let some = "book"; for (let i of some){ console.log(i) }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105557.html
摘要:它是語言的第七種數據類型,前六種是布爾值字符串數值對象。在中,根據屬性名來進行判斷。,是一個布爾值,表示該對象使用時,是否可以展開。等同于,指向該對象的默認遍歷器方法,即該對象進行循環時,會調用這個方法,返回該對象的默認遍歷器。 本文字數:3000+,閱讀時間6分鐘。 如果有理解不到位的地方,歡迎大家糾錯。如果覺得還可以,希望大家可以點個贊。 謝謝大家。 目錄 一、Symbol是什么...
摘要:返回一個布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。返回的都是遍歷器對象。結構的實例的方法,用于對每個成員執行某種操作,沒有返回值。這個特點意味著,無法引用的成員,因此是不可遍歷的。數組成員是一個或多個表示鍵值對的一維數組。 本文字數:4700+,閱讀時間約10分鐘。 如果有理解不到位的地方,歡迎大家糾錯。 一、Set 【01】Set是一種數據結構。類似于數組,但是成員的值...
摘要:箭頭函數本文字符數,閱讀時間約分鐘左右。箭頭函數等于說,只保留了函數的參數和返回。箭頭函數體內的,繼承的是外層代碼塊的。所以,不用用箭頭函數聲明對象的方法。不可以使用命令因此箭頭函數不能用作函數。 【01】ES6箭頭函數 本文字符數4300+,閱讀時間約8分鐘左右。 【01】箭頭函數 等于說,只保留了函數的參數和返回。省略function和return。 寫法: (形參) => {st...
摘要:三種狀態進行中已完成,又稱已失敗。如果的狀態是,那么的回調函數就會等待的狀態改變,在此之前不會有結果。等價于例子例子的概念是實例的別名,用于指定發生錯誤時的回調函數。 『ES6知識點總結』變量的解構賦值 本文主要內容如下:1 Promise是什么?1.1 特點:1.2 三種狀態:1.3 用處:1.4 Promise缺點:1.5 歷史過程2 生成promise實例3 pr...
摘要:基本介紹提供了新的數據結構。初始化本身是一個構造函數,用來生成數據結構。函數可以接受一個數組或者具有接口的其他數據結構作為參數,用來初始化。返回一個布爾值,表示該值是否為的成員。清除所有成員,無返回值。 基本介紹 ES6 提供了新的數據結構 Set。 它類似于數組,但是成員的值都是唯一的,沒有重復的值。 初始化 Set 本身是一個構造函數,用來生成 Set 數據結構。 let set ...
閱讀 3222·2021-11-11 16:55
閱讀 2458·2021-10-13 09:39
閱讀 2392·2021-09-13 10:27
閱讀 2155·2019-08-30 15:55
閱讀 3083·2019-08-30 15:54
閱讀 3127·2019-08-29 16:34
閱讀 1819·2019-08-29 12:41
閱讀 1065·2019-08-29 11:33