ES6迭代器

来源:https://www.cnblogs.com/LHLVS/archive/2019/05/07/10827901.html
-Advertisement-
Play Games

說起迭代器, 那就要先瞭解迭代模式 迭代模式: 提供一種方法可以順序獲得聚合對象中的各個元素, 是一種最簡單, 也是最常見的設計模式,它可以讓用戶通過特定的介面尋訪集合中的每一個元素 而不用瞭解底層的實現。 迭代器 : 依照迭代模式的思想而實現, 分為內部迭代器和外部迭代器, 內部迭代器: 本身是函 ...


說起迭代器, 那就要先瞭解迭代模式

迭代模式: 提供一種方法可以順序獲得聚合對象中的各個元素, 是一種最簡單,

      也是最常見的設計模式,它可以讓用戶通過特定的介面尋訪集合中的每一個元素

      而不用瞭解底層的實現。

迭代器 : 依照迭代模式的思想而實現,

    分為內部迭代器和外部迭代器,

內部迭代器: 本身是函數, 該函數內部定義好迭代規則,完全接手整個迭代過程

       外部只需要一次初始調用,如Array.prototype.forEach,  Jquery.each

外部迭代器: 本身是函數, 執行返回迭代對象,迭代下一個元素必須顯示調用,

      調用複雜度增加,但靈活性增強。

我們主要來瞭解一下外部迭代器:

外部迭代器本身是一個函數, 執行這個函數就相當於啟動了這個迭代器,

然後我們每次迭代需要手動調用next()方法,返回一個對象,

基於此我們來自己實現一個外部迭代器

const arr = [2,3,4];
function OuterIterator(o) {
    let curIndex = 0;
    let next = () => {
        return {
            value: o[curIndex],
            done: o.length === ++curIndex,
        }
    };
    return {
        next
    }
}
const oIt = OuterIterator(arr);
console.log(oIt.next());
console.log(oIt.next());
console.log(oIt.next());

結果:

我們為什麼要用外部迭代器呢 ? 

想象一個場景, 後端給前端返回一個數組形式的數據, 前端通過for 迴圈遍歷

       當業務變動時, 後端傳給前端的不再是數組了, 而是一個對象又

      或者是一個Map/Set 結構的數據, 那前端的遍歷代碼就需要大規模重寫。

所以我們要標準化迭代操作,

解決方案: ES6  引入Iterator, 部署在NodeLlist,  argument,  Array, Set, Map , 字元串

      等數據上的Symbol.iterator屬性   , 使得這些數據是可迭代的, 並可進行

      for...of   ,    ...   ,  Array.from等操作。

這裡插播一個內容Symbol:  js 第七種 基本數據結構

         特點: 唯一, 可作為對象屬性, 有靜態方法Symbol.iterator

Symbol如果傳入的是對象的話,會隱式調用對象的toString() 方法,比如:

let os = Symbol({'name': 'liu'});
console.log(os);
let os2 = Symbol({'name': 'liu', toString() {
    return "我最帥"
    }});
console.log(os2);

我們重寫了對象的toString方法, 結果:

回到主題, 原生有iterator介面的只有NodeLlist,  argument,  Array, Set, Map , 字元串等數據

對象上是沒有iterator的, 所以它不能被迭代, 也不能進行for...of   ,    ...   ,  Array.from等操作

那我們要迭代對象怎麼辦呢 ? 

沒錯, 就是給它加上我們自己按照ES6規範寫外部迭代器:

const obj = {
  0: 'liu',
  1: '18',
  2: 'man',
 }; console.log([...obj]);

直接用...操作符報錯, obj 不可迭代

const obj = {
    0: 'liu',
    1: '18',
    2: 'man',
    length: 4,
    [Symbol.iterator] : function () {
        let curIndex = 0;
        let next = () => {
            return {
                value: this[curIndex],
                done: this.length === ++curIndex,
            }
        };
        return {
            next
        }
    }
};
console.log([...obj]);

結果:

obj必須是類數組, 就是屬性是數字 , 且有length屬性 才能這樣寫。

我們下一篇來討論generator生成器, 它可以生成一個迭代對象。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Mixin Messenger 早期採用 FMDB 後來切換至 WCDB 沿用至今,一直比較可靠穩定,這裡分享一下使用心得和功能擴展。 ...
  • 首先我們來看看仿寫之後的效果: 看到是這個界面我們首先應該思考這些按鈕是怎麼做出來的?有了一個整體的思路之後才知道該怎麼辦。最開始我想的就直接利用button控制項上面直接加上png的圖片就可以形成一個按鈕了,但當我加入圖片之後,發現因為圖片太大導致一個按鈕都會占據一個屏幕一半的空間,實在是得不償失, ...
  • MT6763)具有集成的藍牙、fm、wlan和gps模塊,是一個高度集成的基帶平臺,包括數據機和應用處理子系統,啟用LTE/LTE-A和C2K智能手機應用程式。該晶元集成了ARM Cortex-A53,工作頻率可達2.0GHz,並集成了功能強大的多標準視頻編解碼器。此外,一組廣泛的介面D連接外圍 ...
  • 昨天:android studio安裝好後,在網上學習了一些基礎知識,來豐富自己對android開發的經驗,因為自己在安卓開發這一塊完全就是小白,所以基礎很重要。 看看成果吧: 遇到的問題: 1.在運行時,一個為R的文件經常性報錯,通過ctrl定位發現R為layout文件中所有的綜合,它包含所有文件 ...
  • 發現 jqGrid TreeGrid 載入的數據必須要排序 給了兩種平滑數據模式盡然不內部遞歸 所以改了下源碼加了個數據二次過濾器擴展 數據本該是這樣的 結果沒排序成這樣了 (而且還得是從根節點到子節點整體排序) 1. loadFilters: 數據過濾器擴展 (順帶把ParentId為非字元串類型 ...
  • 雙向數據綁定: 所謂雙向數據綁定是指View(視圖)與Model(模型)之間的綁定:View<=>Model。 View的改變: 通過界面交互使視圖發生改變,如Input框的輸入,Select元素的選擇,scrollBar滾動,瀏覽器視窗大小改變等等。 Model的改變: 如在Ajax, promi ...
  • 首先,我們要瞭解Node.js不是一種語言,它只是一個除了瀏覽器之外的,可以運行js的環境。 其次,Node能做些什麼 ? web伺服器、 命令行工具、 網路爬蟲、 桌面應用程式開發等 3.接下來使用Node.js創建簡單的伺服器 第一種寫法: 第二種寫法: 個人推薦:第二種寫法,可以很好的瞭解。 ...
  • 註意點: position屬性 定義建議元素佈局所用的定位機制 {position:static/absolute/relative/fixed;} static:預設值,沒有定位 absolute:絕對定位元素,相對於static定位以外的第一個父元素進行定位。可以通過left、top、right ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...