检查是否有迭代
在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; }