检查对象是否为 collection/iterable?

Check if object is collection/iterable?

我必须在构造函数中初始化一个对象集合,我想支持所有集合类型,例如 Arrays、Maps 和 Sets。 typeof 只会 return 对象,似乎没有通用的 Collections 实用对象可以提供像 Array.isArray() 这样的功能。

来自 Java 和经典的继承风格,我的下一个冲动是检查对象的继承。然而,我对各种原型函数的实验并没有发现任何东西。我能想到的最好办法是创建一个函数来检查 .prototype.isPrototypeOf(object) 中的 Map、Set 和 Array。但这可能是因为我实际上并不了解 Javascripts 原型继承。

有没有更好的方法来检查一个对象是否是一个集合?

我想到了以下 hack,IE 11 及更高版本应该支持它:

if(typeof collection !== "undefined" && typeof collection.forEach !== "undefined"){
  collection.forEach(function(value, param2, collection){
    //do stuff
  }, this);
}

每个集合类型的param2是不同的:对于Arrays它是索引,对于Maps它是键,而Sets只是重复相同的值以匹配Maps和Arrays的函数签名.

this 参数将匿名函数的 this 分配给外部函数的 this – 启用对外部函数中分配的变量的引用。否则它将默认为全局 window.

我强烈希望直接测试对象的继承或基于标准的 Collections.isCollection 类型对象,并将 select 一个新的答案。

您可以检查它是否是 Iterable

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

MDN web docs - Iteration protocols