最准确的判断方式是检查变量是否非空且symbol.iterator属性存在且为函数:const isiterable = (obj) => obj != null && typeof obj[symbol.iterator] === 'function';该方法排除null/undefined,不触发副作用,兼容es6+环境。

最准确的方式是检查该变量是否具有 Symbol.iterator 属性,且该属性是一个可调用的函数。
核心判断逻辑
必须同时满足两个条件:
-
存在
Symbol.iterator属性:即obj[Symbol.iterator] !== undefined -
该属性是函数类型:即
typeof obj[Symbol.iterator] === 'function'
二者缺一不可。只检查是否存在、或只检查是否为函数,都可能误判(例如某些对象把 Symbol.iterator 定义为非函数值)。
推荐的安全写法
直接使用以下表达式,简洁可靠:
const isIterable = (obj) => obj != null && typeof obj[Symbol.iterator] === 'function';
说明:
-
obj != null排除了null和undefined(它们没有属性访问能力) - 不调用
obj[Symbol.iterator](),避免触发副作用或意外报错 - 现代环境(ES6+)无需 polyfill
Symbol,若需兼容极旧环境(如 IE),可先加一层typeof Symbol !== 'undefined'判断
常见类型验证示例
以下结果均符合上述判断逻辑:
-
[1, 2, 3]→ true(数组原生支持) -
"abc"→ true(字符串可按字符迭代) -
new Map()、new Set()→ true -
document.querySelectorAll('div')→ true(现代浏览器中 NodeList 是可迭代的) -
{}、{ a: 1 }、arguments(非箭头函数内)、Promise→ false
不要依赖的误判方式
这些方法看似直观,但并不可靠:
-
看构造函数名:如
obj.constructor === Array—— 自定义对象也可实现可迭代协议 -
查
length属性:类数组对象(如{ length: 2, 0: 'a', 1: 'b' })通常不可迭代 -
用
for...of尝试运行:会直接抛错,不适合做前置判断 -
仅检测原型链上是否有
Symbol.iterator:规范要求的是对象自身或其原型链上有该属性,但实际只需能取到即可;重点仍在“存在且为函数”,而非位置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











