检查是否有迭代

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

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

我试图find数组,迭代器和生成器的共同属性,但一直无法这样做。

除了在try块中做一个for ... of并检查types错误,有没有一个干净的方法来做到这一点?

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

 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的思维模式)

为什么这么冗长?

 const isIterable = object => object != null && typeof object[Symbol.iterator] === 'function' 

注意 可迭代的定义。 如果你来自其他语言,你会期望你可以迭代一些东西,比如for循环是可迭代的 。 恐怕在这里, 迭代意味着实现迭代协议 。

为了使事情更清楚,上面的所有例子都在这个对象{a: 1, b: 2}上返回false ,因为那个对象没有实现迭代协议。 所以你将无法用for...of来迭代它for...of 但是你仍然可以用for...in

所以,如果你想避免痛苦的错误,通过重命名你的方法,使你的代码更具体,如下所示:

 /** * @param variable * @returns {boolean} */ const hasIterationProtocol = variable => variable !== null && Symbol.iterator in Object(variable); 

如前所述,如今testingobj是否可迭代就行了

 obj != null && typeof obj[Symbol.iterator] === 'function' 

历史答案(不再有效)

for..of构造是ECMASCript第六版语言规范草案的一部分。 所以它可以在最终版本之前改变。

在这个草稿中, 可迭代的对象必须有函数iterator作为属性。

你可以检查一个对象是否像这样迭代:

 function isIterable(obj){ if(obj === undefined || obj === null){ return false; } return obj.iterator !== undefined; }