报错说明对象未实现迭代协议,需检查其是否拥有symbol.iterator方法;原生可迭代类型包括数组、字符串、map等,普通对象不可直接for...of遍历,可转为object.keys/values/entries或用array.from转换。

当使用 for...of 遍历一个对象却报错 TypeError: XXX is not iterable,说明该对象没有实现迭代协议(即没有 [Symbol.iterator] 方法)。排查核心是确认目标值是否具备可迭代性,并理解哪些类型天然支持、哪些需要手动适配。
检查对象是否拥有 [Symbol.iterator] 方法
这是最直接的判断方式。在控制台或代码中打印该属性:
-
console.log(obj[Symbol.iterator])—— 若返回函数,说明它是可迭代的;若为undefined或null,则不可迭代。 - 注意:不能用
typeof obj[Symbol.iterator] === 'function'粗暴判断,因为有些对象(如字符串)的迭代器可能被遮蔽或被代理拦截,需结合上下文验证。
确认数据类型是否原生可迭代
JavaScript 中以下类型默认实现了 Symbol.iterator:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数组(
[])、字符串('')、Map、Set、TypedArray(如Uint8Array)、arguments 对象、NodeList - 普通对象(
{})、null、undefined、数字、布尔值、函数等不是可迭代对象 - 常见误判:认为
{a:1, b:2}能用for...of遍历 —— 实际上必须用for...in或Object.keys()等间接方式
快速修复不可迭代对象的常用方法
若你确实想用 for...of 遍历普通对象或类数组,可临时转换:
- 对象 → 键数组:
for (const key of Object.keys(obj)) { ... } - 对象 → 值数组:
for (const val of Object.values(obj)) { ... } - 对象 → 键值对数组:
for (const [k, v] of Object.entries(obj)) { ... } - 类数组(如
document.querySelectorAll('div'))→ 数组:for (const el of Array.from(nodelist)) { ... }或[...nodelist] - 自定义对象添加迭代器(适合封装类):
class MyCollection {<br> constructor(items) { this.items = items; }<br> *[Symbol.iterator]() { yield* this.items; }<br>}
调试技巧:捕获并定位问题源头
在复杂嵌套或动态数据流中,错误可能隐藏较深:
- 在
for...of前加断点或日志:console.log('to iterate:', target, target?.[Symbol.iterator]) - 用
Array.isArray(target)、target instanceof Map等辅助判断类型,避免仅靠typeof(例如typeof {}和typeof []都是'object') - 注意异步场景:Promise、fetch 返回结果不是可迭代对象,别直接
for...of await someAsyncCall(),应先await再遍历
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










