判断一个值是否为可迭代对象,核心是检查它是否有合法的symbol.iterator方法:obj != null && typeof obj[symbol.iterator] === 'function';该方法必须存在且为函数类型,才能被for...of等语法正确消费。

判断一个值是否为可迭代对象,核心就看它有没有合法的 Symbol.iterator 方法——这是 JavaScript 迭代协议的“准入证”。
检测逻辑:两步确认法
仅检查 obj[Symbol.iterator] 是否为函数还不够严谨。必须同时满足:
- 对象不为
null或undefined -
obj[Symbol.iterator]存在且类型是"function" - 调用该方法后返回的对象有
next方法(可选验证,用于排除极少数伪造实现)
简洁可靠的检测函数
日常开发中,以下写法已覆盖全部标准场景:
const isIterable = obj => obj != null && typeof obj[Symbol.iterator] === 'function';
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
使用示例:
-
isIterable([1,2,3])→true -
isIterable('abc')→true -
isIterable(new Map())→true -
isIterable({a:1})→false -
isIterable(null)→false
为什么不用 in 操作符?
Symbol.iterator in obj 看似直观,但存在隐患:如果对象原型链上意外挂载了该 Symbol(比如被污染),会误判为可迭代。而直接取属性值并判断类型,只认自身或标准原型上的有效实现,更安全。
实际应用中的常见误判点
注意这些“看起来像、其实不是”的情况:
-
arguments对象:ES5 中不可迭代(无Symbol.iterator),ES6+ 环境下部分引擎已补全,但兼容性不统一,建议用剩余参数...args替代 - 类数组对象(如
{0: 'a', 1: 'b', length: 2}):默认不可迭代,需手动部署Symbol.iterator才能用于for...of或展开运算符 - Generator 函数本身不可迭代,但其调用结果(generator object)是可迭代的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










