检查某些内容是否可迭代

2022-08-30 02:44:41

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

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

我试图为数组,迭代器和生成器找到通用属性,但无法做到这一点。

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


答案 1

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

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

既然我们谈论的是..我假设,我们处于ES6的思维模式。

另外,如果此函数是字符串,则不要感到惊讶,因为字符串会迭代其字符。trueobj


答案 2

最简单的解决方案实际上是这样的:

function isIterable (value) {
  return Symbol.iterator in Object(value);
}

Object将任何不是对象的东西包装在一个中,即使原始值不是对象,也允许操作员工作。 并转换为空对象,因此不需要边缘情况检测,并且字符串被包装成可迭代的String对象。innullundefined