检查对象是否是可收集/可迭代的?

时间:2015-05-05 19:05:41

标签: javascript inheritance collections

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以检查是Iterable代替:

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

MDN web docs - Iteration protocols

答案 1 :(得分:0)

我提出了以下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的函数签名。 / p>

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

我非常希望直接测试对象的继承或基于标准的Collections.isCollection类型对象,并选择新的答案。