摘要:實現原理創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。具體來說,就是返回一個包含和兩個屬性的對象。接口部署在對象的屬性上可以調用這個屬性,就得到遍歷器對象。
Iterator實現原理
創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。
第一次調用指針對象的next方法,可以將指針指向數據結構的第一個成員。
第二次調用指針對象的next方法,指針就指向數據結構的第二個成員。
不斷調用指針對象的next方法,直到它指向數據結構的結束位置。
每一次調用next方法,都會返回數據結構的當前成員的信息。具體來說,就是返回一個包含value和done兩個屬性的對象。其中,value屬性是當前成員的值,done屬性是一個布爾值,表示遍歷是否結束。
ES6 里的迭代器并不是一種新的語法或者是新的內置對象(構造函數), 而是一種協議,所有遵循了這個協議的對象都可以稱之為迭代器對象,所以說迭代器是一種協議,一個統一的接口標準,兩個屬性都不返回值也不會報錯,但是不符合協議標準了,就不能稱作迭代器了
如何部署Iterator接口在ES6中,有三類數據結構原生具備Iterator接口:數組、某些類似數組的對象、Set和Map結構,對象(Object)之所以沒有默認部署Iterator接口,是因為對象的哪個屬性先遍歷,哪個屬性后遍歷是不確定的,需要開發者手動指定。
Iterator接口部署在對象的Symbol.Iterator屬性上, 可以調用這個屬性,就得到遍歷器對象。
var arr = ["a", "b", "c"]; var iterator = arr[Symbol.iterator](); var a = iterator.next(); console.log(a) //{value: "a", done: false}for--of與for--in
for...in 遍歷每一個屬性名稱,而 for...of遍歷每一個屬性值。
在對象沒有部署Iterator接口的情況下調用for...of會報錯。當一個部署了Iterator接口的對象調用for...of時,
實現的步驟是這樣的:
調用對象的Symbol.Iterator的屬性獲得遍歷器生成函數;
調用遍歷器生成函數返回遍歷器對象
其實for...of就相當于一直調用遍歷器對象的next方法,直到返回done為true;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79715.html
摘要:變量聲明與賦值值傳遞淺拷貝與深拷貝詳解歸納于筆者的現代開發語法基礎與實踐技巧系列文章。變量聲明在中,基本的變量聲明可以用方式允許省略,直接對未聲明的變量賦值。按值傳遞中函數的形參是被調用時所傳實參的副本。 ES6 變量聲明與賦值:值傳遞、淺拷貝與深拷貝詳解歸納于筆者的現代 JavaScript 開發:語法基礎與實踐技巧系列文章。本文首先介紹 ES6 中常用的三種變量聲明方式,然后討論了...
摘要:通過生成器創建的迭代器也是可迭代對象,因為生成器默認會為屬性賦值。我們可以用來訪問對象的默認迭代器,例如對于一個數組獲得了數組這個可迭代對象的默認迭代器,并操作它遍歷了數組中的元素。 ES6 新的數組方法、集合、for-of 循環、展開運算符(...)甚至異步編程都依賴于迭代器(Iterator )實現。本文會詳解 ES6 的迭代器與生成器,并進一步挖掘可迭代對象的內部原理與使用方法 ...
摘要:每個任務必須顯式地掛起自己,在任務切換發生時給予它完全的控制。在這些嘗試中,數據經常在任務之間共享。但由于明確的暫停,幾乎沒有風險。 翻譯自 github 概述 什么是generators? 我們可以把generators理解成一段可以暫停并重新開始執行的函數 function* genFunc() { // (A) console.log(First); yi...
摘要:注意屬性名代表了數組的索引號,如果沒有這個索引號,轉出來的數組中對應的元素就為空。對象的屬性名不能轉換成索引號時。可選參數可選參數,執行回調函數時對象。 ES6為Array增加了from函數用來從一個類似數組或可迭代對象中創建一個新的,淺拷貝的數組實例。不過只可以將一下兩種對象轉換成數組。1.部署了Iterator接口的對象,比如:Set,Map,Array。2.類數組對象,什么叫類數...
摘要:凍結對象可以使用方法。對象的解構賦值必須要屬性名相同,順序毫無影響。數組解構賦值默認值,當等號右邊的值時,默認值生效。 let變量 let聲明的變量在let命令所在的代碼塊中有效。不存在變量提升,只能先聲明后使用。 暫存死區 如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量。 var a = 1; { ...
閱讀 2727·2021-11-22 15:22
閱讀 1631·2021-11-22 14:56
閱讀 3616·2021-09-22 15:12
閱讀 2403·2021-09-02 15:41
閱讀 2122·2021-08-27 16:26
閱讀 1113·2019-08-30 15:55
閱讀 2139·2019-08-29 17:30
閱讀 665·2019-08-29 16:26