js迭代器

文章目錄

  • 前言
    • 實現原理:
    • 調用迭代器
    • 自制迭代器


前言

迭代器是 JSt 中一種特殊的對象,它提供了一種統一的、通用的方式遍歷個各種不同類型的數據結構。

可以遍歷的數據結構包括:數組、字符串、Set、Map 等可迭代對象。我們也可以自定義實現迭代器,以支持遍歷自定義的數據結構。

實現原理:

迭代器的實現原理是通過定義一個特定的next() 方法,在每次迭代中返回一個包含兩個屬性的對象:donevalue
next()方法

  1. 參數:無參數或者有一個參數。
  2. 返回值:返回一個有兩個屬性的對象。屬性值如下:
    done:布爾值,表示迭代是否完成
    value:當前步驟的值

每次調用next方法,都會改變value值至下一步,直到迭代完成

據此,可以給數組手寫一個迭代器函數

const strArr = ['a', 'b', 'c', 'd'];// 為數組封裝迭代器
function create(arr) {let index = 0;return {next: () => {if (index < arr.length) {return { done: false, value: arr[index++] };} else {return { done: true };}},};
}const str = create(strArr);
console.log(JSON.stringify(str.next()));
console.log(JSON.stringify(str.next()));
console.log(JSON.stringify(str.next()));
console.log(JSON.stringify(str.next()));
console.log(JSON.stringify(str.next()));
//輸出
// {"done":false,"value":"a"}
// 測試.html:28 {"done":false,"value":"b"}
// 測試.html:29 {"done":false,"value":"c"}
// 測試.html:30 {"done":false,"value":"d"}
// 測試.html:31 {"done":true}

可以看到 ,每調用一次next,value會向后移動,直至遍歷完畢

調用迭代器

語法

const a=可迭代對象[Symbol.iterator]()

實例如下

const myArr = ['a', 'b', 'c', 'd'];// 獲取數組自帶的迭代器對象
const myIterator = myArr[Symbol.iterator]();// 通過迭代器的 next() 方法遍歷數組
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
//輸出
// {"value":"a","done":false}
// 測試.html:17 {"value":"b","done":false}
// 測試.html:18 {"value":"c","done":false}
// 測試.html:19 {"value":"d","done":false}
// 測試.html:20 {"done":true}

自制迭代器

很多數據對象由于不是可迭代對象,我們可以為其手動創建一個迭代器

與函數不同,這次將其封裝在對象中,并且此后調用方法一致

const myObj1 = {strArr: ['a', 'b', 'c', 'd'],// 在 myObj1 的內部創建一個迭代器[Symbol.iterator]: function () {let index = 0;const Iterator = {next: function () {if (index < myObj1.strArr.length) {return { done: false, value: myObj1.strArr[index++] };} else {return { done: true };}},};return Iterator;},
};// 獲取 myObj1 的迭代器對象
const myIterator = myObj1[Symbol.iterator]();
// 通過迭代器遍歷 myObj1.strArr 的數據
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
console.log(JSON.stringify(myIterator.next()));
// 輸出
// {"done":false,"value":"a"}
// 測試.html:32 {"done":false,"value":"b"}
// 測試.html:33 {"done":false,"value":"c"}
// 測試.html:34 {"done":false,"value":"d"}
// 測試.html:35 {"done":true}

大部分步驟一致,只是在函數前加上[Symbol.iterator]:
而可迭代對象可以使用for of進行遍歷
如下

for(let item of myObj1){console.log(item);
}
//輸出同樣效果

當自定義類復雜時,自制迭代器也就更難寫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89916.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

chainlink VRF中文教程(含mock),解決error: Arithmetic Underflow in createSubscription

?我使用的版本&#xff1a;chainlink-brownie-contracts version:1.3.0?1. Import 相關包 ,,, import {VRFConsumerBaseV2Plus} from "chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol"; import {VRFV2PlusClient} from "chainlink/contract…

非線性優化框架CasADi工具箱求解最優控制問題OCP

CasADi是一個開源的Python/MATLAB庫&#xff0c;主要用于數值優化&#xff0c;特別是最優控制問題。它提供了一個易于使用的符號框架&#xff0c;用于處理和生成表達式&#xff0c;以及高效地生成導數信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口臺式顯示器:LDR6021引領新潮流

Type-C單口便攜顯示器LDR6021是市場上一種新興的顯示設備&#xff0c;以下是對其的詳細介紹一、主要特點 便攜性:LDR6021采用了Type-C接口作為數據傳輸和供電接口&#xff0c;這種設計使得它能夠與各種支持Type-C接口的設備無縫連接&#xff0c;如筆記本電腦、智能手機、平板電…

在翻譯語義相似度和會議摘要相似度評估任務中 ,分類任務 回歸任務 生成任務區別

在翻譯語義相似度&#xff08;Translation Semantic Similarity&#xff09;和會議摘要相似度&#xff08;Meeting Summary Similarity&#xff09;等任務中&#xff0c;通常會根據任務的目標和輸出形式&#xff0c;將其劃分為三類常見的任務類型&#xff1a;1. 分類任務定義&a…

UGUI 性能優化系列:第二篇——Canvas 與 UI 元素管理

UGUI 性能優化系列&#xff1a;第一篇——基礎優化與資源管理 UGUI 性能優化系列&#xff1a;第二篇——Canvas 與 UI 元素管理 UGUI 性能優化系列&#xff1a;第三篇——渲染與像素填充率優化 UGUI 性能優化系列&#xff1a;第四篇——高級優化與注意事項 在 UGUI 性能優化…

企業開發轉型 | 前端AI化數字化自動化現狀

文章目錄前端AI化數字化自動化發展現狀引言調研背景與目的調研范圍與方法前端AI化技術現狀與工具生態主流AI工具分類與能力矩陣工具能力對比分析關鍵能力指標深度解析大模型技術成熟度評估前端AI化核心應用場景與人力優化路徑代碼生成與自動化開發設計到代碼全鏈路自動化自動化…

Mysql(運維-日志)

黑馬mysql筆記 最好開兩個窗口&#xff0c;一個用于mysql命令&#xff0c;一個用于liunx命令 目錄 錯誤日志 二進制日志 介紹 日志格式 mysq默認二進制日志文件為ROW 日志查看 二進制日志查看命令 默認日志文件格式下查看日志內容 更改日志文件格式查看日志內容 日志…

RabbitMQ:解鎖高效消息傳遞的密碼[特殊字符]

目錄 一、RabbitMQ 核心概念 1.1整體框架 1.2元素詳解 1.2.1 生產者&#xff08;Producer&#xff09;&消費者&#xff08;Consumer&#xff09; 1.2.2 交換機&#xff08;Exchange&#xff09; ①fanout &#xff08;廣播型&#xff09; ②direct &#xff08;直連型…

StarRocks × MinIO:打造靈活高效的存算分離方案

“存算分離”&#xff08;Decoupled Storage and Compute&#xff09;是一種在現代數據系統中被廣泛采用的架構設計。它將計算和存儲解耦&#xff0c;使二者可以獨立擴展&#xff0c;提升資源利用率并降低運維成本。StarRocks 從 3.0 版本開始支持這一架構&#xff0c;允許用戶…

R語言的分位數回歸實踐技術高級應用

回歸是科研中最常見的統計學研究方法之一&#xff0c;在研究變量間關系方面有著極其廣泛的應用。由于其基本假設的限制&#xff0c;包括線性回歸及廣義線性回歸在內的各種常見的回歸方法都有三個重大缺陷&#xff1a;(1)對于異常值非常敏感&#xff0c;極少量的異常值可能導致結…

Tomcat的部署、單體架構、session會話、spring

一、Tomcat的部署①②③④⑤二.web項目在tomcat服務中如何運行&#xff1a;1.web項目源碼部署在服務器的webapps目錄里面2.將web項目打包(war),部署在服務器的webapps目錄里面。三 單體架構和前后端分離單體架構是將所有功能模塊&#xff08;包括前端界面、后端邏輯、數據庫交互…

海康威視視覺算法崗位30問及詳解

海康威視視覺算法崗位30問及詳解 前言 視覺算法工程師是人工智能領域的熱門崗位&#xff0c;尤其在安防、自動駕駛、工業檢測等行業有著廣泛應用。海康威視作為行業龍頭&#xff0c;對視覺算法崗位的要求較高&#xff0c;面試問題既考察基礎理論&#xff0c;也關注工程實現。本…

14.7 Alpaca格式深度解析:3倍指令準確率提升的LLM微調秘訣

文章目錄 Alpaca格式深度解析:3倍指令準確率提升的LLM微調秘訣 指令微調格式:Alpaca Format 深度解析 14.3.1 Alpaca 格式誕生背景與技術價值 14.3.2 Alpaca 格式結構解析 14.3.3 實戰 Dolly-15K 數據轉 Alpaca 格式 14.3.4 Alpaca 格式的工程化實踐 14.3.5 格式擴展與挑戰應…

42.sentinel實現線程隔離

線程隔離有兩種實現方式: 1.線程池隔離 優點: 1.支持主動超時,線程池中的線程都是可控的,可以停掉某個線程。 2.支持異步調用,每個請求都是一個獨立的線程,線程之間不受影響。 缺點: 線程的額外開銷比較大 適用場景: 低扇出(一個微服務,不會依賴很多微服務)…

【過擬合和欠擬合】——深度學習.全連接神經網絡

目錄 1 概念認知 1.1 過擬合 1.2 欠擬合 1.3 如何判斷 2 解決欠擬合 3 解決過擬合 3.1 L2正則化 3.1.1 數學表示 3.1.2 梯度更新 3.1.3 作用 3.1.4 代碼實現 3.2 L1正則化 3.2.1 數學表示 3.2.2 梯度更新 3.2.3 作用 3.2.4 與L2對比 3.2.5 代碼實現 3.3 Drop…

Java設計模式之行為型模式(備忘錄模式)應用場景分析

最近看到一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 一、用戶交互與編輯操作 文本編輯器撤銷/重做 場景描述&#xff1a;用戶編輯文檔時&#xff0c;可通過CtrlZ撤銷誤操作&#xff0c;或通過Ctr…

5.Java的4個權限修飾符

1.private&#xff08;私有訪問權限&#xff09;最嚴格的訪問修飾符&#xff0c;它限定被修飾的成員僅能在聲明它的當前類內部訪問。其他任何外部類都無法直接訪問該成員。作用&#xff1a;強制封裝&#xff0c;確保類內部實現細節的隱藏性和數據安全性2.默認權限&#xff08;包…

Linux入門介紹

目錄 一、環境 二、Linux發展歷史 1、計算機 2、操作系統 四、認識Linux的 內核版本名稱 一、環境 一般是Centos 7 Ubuntu 20.04 / 22.04 前者已經停止更新與維護&#xff0c;但很多公司還在使用前者 二、Linux發展歷史 1、計算機 1945年 2.14---埃尼阿克---軍事用處&…

spring boot2升級boot3

spring boot2升級boot3 整體流程如下 1、借助于開源的自動化代碼重構工具OpenRewrite&#xff0c;快速地進行代碼重構等 2、相關坐標升級更改 3、配置文件屬性更改 4、打包、構建與運行驗證 1. 前期準備工作第一步&#xff1a;確保升級之前項目是可編譯運行的第二步&#xff1a…

mac終端設置代理

在Mac上配置終端走代理&#xff0c;需設置終端&#xff08;如zsh或bash&#xff09;使用HTTP/HTTPS/SOCKS代理&#xff0c;以便命令行工具&#xff08;如curl、git、npm&#xff09;通過代理訪問網絡。以下是詳細步驟&#xff0c;適用于macOS 10.15及以上版本。 前提條件 代理服…