最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解JavaScrip可迭代對象(Iterable)

 更新時間:2026年05月12日 08:50:13   作者:yqcoder  
本文解釋了ES6引入迭代器和可迭代對象的原因及使用方法,通過引入這兩個概念,JavaScript 統(tǒng)一了數(shù)據(jù)訪問接口,解決了遍歷方式不統(tǒng)一和靈活性差的問題,文章詳細介紹了核心概念、底層原理、實戰(zhàn)案例、常見誤區(qū)及最佳實踐,幫助讀者徹底理解可迭代對象,需要的朋友可以參考下

為什么需要“可迭代”?

在 ES6 之前,我們遍歷數(shù)據(jù)主要靠 for 循環(huán)(基于索引)或 forEach。但這種方式有兩個痛點:

  1. 不通用:數(shù)組能遍歷,但字符串、DOM 節(jié)點列表、Map、Set 的遍歷方式各不相同。
  2. 不靈活:無法自定義遍歷邏輯(比如我想倒序遍歷,或者只遍歷偶數(shù)項)。

為了解決這個問題,ES6 引入了 迭代器 (Iterator)可迭代對象 (Iterable) 的概念,統(tǒng)一了數(shù)據(jù)訪問的接口。

通俗比喻
想象你去一家自助餐廳吃飯。

  • 普通對象:像是一堆散落在桌子上的菜,沒有順序,你只能指著說“我要那個”,不能按順序一個個拿。
  • 可迭代對象:像是傳送帶上的壽司。傳送帶有一個機制(迭代器),讓你可以一個一個地按順序獲取食物,直到吃完為止。

Symbol.iterator 就是那個“啟動傳送帶的按鈕”。只要一個對象身上有這個按鈕,它就是“可迭代的”。

1. 核心概念:誰是誰?

很多初學者容易混淆這兩個術語,我們先厘清定義:

可迭代對象 (Iterable)

  • 定義:實現(xiàn)了 可迭代協(xié)議 的對象。
  • 特征:對象內部必須有一個鍵為 Symbol.iterator 的方法,該方法返回一個迭代器對象
  • 常見例子Array, String, Map, Set, arguments, NodeList。

迭代器 (Iterator)

  • 定義:實現(xiàn)了 迭代器協(xié)議 的對象。
  • 特征:擁有一個 next() 方法,每次調用返回一個包含 valuedone 的對象。
  • 作用:它是真正的“工人”,負責逐個吐出數(shù)據(jù)。

簡單關系
可迭代對象 是工廠,迭代器 是工廠派出的快遞員。
當你使用 for...of 時,JS 引擎會自動調用工廠的 Symbol.iterator 拿到快遞員,然后一直喊 next() 直到送完貨。

2. 底層原理:兩個協(xié)議

協(xié)議一:可迭代協(xié)議 (Iterable Protocol)

只要對象擁有 [@@iterator] 方法(即 Symbol.iterator 屬性),它就是可迭代的。

const arr = [1, 2, 3];
// 檢查是否有 Symbol.iterator 方法
console.log(typeof arr[Symbol.iterator]); // "function"

協(xié)議二:迭代器協(xié)議 (Iterator Protocol)

Symbol.iterator 方法返回的對象,必須滿足以下條件:

  1. 擁有 next() 方法。
  2. next() 返回一個對象 { value: any, done: boolean }
    • value: 當前產出的值。
    • done: 是否遍歷結束(true 表示結束)。

3. 代碼實戰(zhàn):判斷與使用

場景一:哪些是原生的可迭代對象?

// ? 數(shù)組
[1, 2, 3][Symbol.iterator]; // function

// ? 字符串
"hello"[Symbol.iterator]; // function

// ? Map
new Map()[Symbol.iterator](
  // function

  // ? 普通對象
  {},
)[Symbol.iterator]; // undefined -> 不可迭代!

場景二:for...of的本質

當你寫這段代碼時:

for (const item of [1, 2, 3]) {
  console.log(item);
}

JavaScript 引擎實際上在執(zhí)行以下操作:

const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator](); // 1. 獲取迭代器

let result = iterator.next(); // 2. 第一次 next()
while (!result.done) {
  // 3. 如果沒做完
  console.log(result.value); // 4. 處理值
  result = iterator.next(); // 5. 繼續(xù)下一個
}

4. 手寫實現(xiàn):讓普通對象可迭代

這是面試的高頻考點:如何讓一個普通對象支持 for...of

假設我們有一個范圍對象 Range,我們希望它能遍歷出從 startend 的數(shù)字。

const range = {
  start: 1,
  end: 5,
};

// ? 直接遍歷會報錯:range is not iterable
// for (let num of range) { ... }

// ? 改造:添加 Symbol.iterator 方法
range[Symbol.iterator] = function () {
  let current = this.start;
  const last = this.end;

  // 返回一個符合“迭代器協(xié)議”的對象
  return {
    next() {
      if (current <= last) {
        return { value: current++, done: false };
      } else {
        return { value: undefined, done: true };
      }
    },
  };
};

// 現(xiàn)在可以愉快地遍歷了!
for (let num of range) {
  console.log(num); // 1, 2, 3, 4, 5
}

// 也可以使用展開運算符
console.log([...range]); // [1, 2, 3, 4, 5]

關鍵點
Symbol.iterator 函數(shù)必須返回一個的迭代器對象。這樣即使嵌套遍歷或多次遍歷,狀態(tài)也不會沖突。

5. 常見誤區(qū):Array-like vs Iterable

很多“類數(shù)組對象”(Array-like)不是可迭代對象,這經常導致 Bug。

誤區(qū):arguments和NodeList

在舊版瀏覽器或某些環(huán)境下,document.querySelectorAll 返回的 NodeList 可能沒有 Symbol.iterator(雖然現(xiàn)代瀏覽器大多已支持,但需警惕兼容性)。

const divs = document.querySelectorAll("div");

// ? 在某些舊環(huán)境或特定對象上可能失效
// for (let div of divs) { ... }

// ? 安全做法:使用 Array.from 轉換
const divArray = Array.from(divs);
divArray.forEach((div) => console.log(div));

最佳實踐:如何安全地遍歷?

如果你不確定一個對象是否可迭代,可以使用以下工具函數(shù)檢測:

function isIterable(obj) {
  // 檢查 null/undefined
  if (obj == null) return false;
  // 檢查是否有 Symbol.iterator 方法且類型為函數(shù)
  return typeof obj[Symbol.iterator] === "function";
}

console.log(isIterable([])); // true
console.log(isIterable({})); // false
console.log(isIterable("")); // true

6. 總結

概念說明關鍵方法/屬性
可迭代對象能被 for...of 遍歷的對象obj[Symbol.iterator]
迭代器負責逐個返回數(shù)據(jù)的對象iterator.next()
next() 返回值包含值和狀態(tài)的對象{ value: ..., done: ... }
原生可迭代Array, String, Map, Set, arguments 等-
非可迭代普通 Object {}-

博主寄語
可迭代協(xié)議是 JavaScript 統(tǒng)一數(shù)據(jù)訪問方式的偉大嘗試。
它不僅讓 for...of 成為可能,還支撐起了生成器 (Generator)、異步迭代器 (Async Iterator) 等高級特性。

記住口訣
想要遍歷用 for...of
對象必須有 iterator。
next 方法吐數(shù)據(jù),
done 為真停腳步。

以上就是一文詳解JavaScrip可迭代對象(Iterable)的詳細內容,更多關于JavaScrip可迭代對象Iterable的資料請關注腳本之家其它相關文章!

相關文章

  • javascript中import和export用法示例總結

    javascript中import和export用法示例總結

    在 ES6 之前,社區(qū)制定了一些模塊加載方案,最主要的有 CommonJS 和 AMD 兩種,前者用于服務器,后者用于瀏覽器,這篇文章給大家介紹了javascript中import和export用法總結,感興趣的朋友一起看看吧
    2025-05-05
  • JS的反射問題

    JS的反射問題

    兩個等號直接比較值,但是類型不能相互轉換的時候報錯
    2010-04-04
  • 點擊彈出層效果&彈出窗口后網頁背景變暗效果的實現(xiàn)代碼

    點擊彈出層效果&彈出窗口后網頁背景變暗效果的實現(xiàn)代碼

    本篇文章主要是對點擊彈出層效果&彈出窗口后網頁背景變暗效果的實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • Web純前端“旭日圖”實現(xiàn)元素周期表

    Web純前端“旭日圖”實現(xiàn)元素周期表

    本文主要介紹了Web純前端“旭日圖”實現(xiàn)元素周期表的實例解析。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • javascript中的some方法使用解讀

    javascript中的some方法使用解讀

    這篇文章主要介紹了javascript中的some方法使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • JavaScript實現(xiàn)Tab選項卡切換

    JavaScript實現(xiàn)Tab選項卡切換

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)Tab選項卡切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • jquery+css3實現(xiàn)網頁背景花瓣隨機飄落特效

    jquery+css3實現(xiàn)網頁背景花瓣隨機飄落特效

    在qq空間可以自定義一些插件,裝飾空間,大家通常就是復制代碼到空間粘貼,會實現(xiàn)非常美觀的效果,有的會隨機飄落一些花瓣,那么這種效果用代碼怎么實現(xiàn)的呢,下面小編給大家詳解jquery實現(xiàn)網頁背景花瓣隨機飄落特效,需要的朋友可以參考下
    2015-08-08
  • 微信小程序學習筆記之目錄結構、基本配置圖文詳解

    微信小程序學習筆記之目錄結構、基本配置圖文詳解

    這篇文章主要介紹了微信小程序學習筆記之目錄結構、基本配置,結合實例形式詳細分析了微信小程序的相關注冊、配置及基本使用方法,并配以圖片加以說明,需要的朋友可以參考下
    2019-03-03
  • JavaScript TAB欄切換效果的示例

    JavaScript TAB欄切換效果的示例

    這篇文章主要介紹了JavaScript TAB欄切換效果的示例,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2020-11-11
  • 讀懂CommonJS的模塊加載

    讀懂CommonJS的模塊加載

    這篇文章主要介紹了CommonJS的模塊加載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

榆中县| 峨边| 墨玉县| 靖安县| 五华县| 厦门市| 洛川县| 靖远县| 迭部县| 涡阳县| 廊坊市| 和龙市| 石渠县| 朝阳市| 曲阳县| 威远县| 赤城县| 湟源县| 芷江| 新郑市| 静宁县| 宁德市| 轮台县| 太原市| 临潭县| 龙游县| 红河县| 平山县| 渭源县| 城口县| 华宁县| 沂源县| 林甸县| 左云县| 大冶市| 扶沟县| 保定市| 黄大仙区| 芦溪县| 屯门区| 响水县|