检查某物是否可迭代

新手上路,请多包涵

在 MDN 文档中: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…of

for...of 构造被描述为能够迭代“可迭代”对象。但是有没有一种好的方法来决定一个对象是否是可迭代的呢?

我试图找到数组、迭代器和生成器的通用属性,但一直无法找到。

除了在 try 块中执行 for ... of 并检查类型错误之外,是否有一种干净的方法来执行此操作?

原文由 simonzack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 755
2 个回答

检查可迭代性的正确方法如下:

 function isIterable(obj) {
  // checks for null and undefined
  if (obj == null) {
    return false;
  }
  return typeof obj[Symbol.iterator] === 'function';
}

为什么这有效(深度可迭代协议): https ://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols

由于我们正在谈论 for..of,我想,我们处于 ES6 思维模式中。

此外,如果 obj 是一个字符串,则此函数返回 true 也不要感到惊讶,因为字符串会遍历其字符。

原文由 Tomas Kulich 发布,翻译遵循 CC BY-SA 4.0 许可协议

if (Symbol.iterator in Object(value)) {

}

Object 将任何不是对象的东西包装成一个。这可以防止 in 运算符抛出异常并消除检查边缘情况的需要。 nullundefined 成为空对象,而字符串被包装到可迭代的 String 对象 中。

我个人建议内联此代码而不是定义一个函数,因为它相对较短且比调用某些 isIterable(x) 函数更明确。


请记住, 可迭代 一词特指 可迭代协议,尽管存在不同的遍历对象的方法。以下列表并不详尽:

原文由 Domino 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题