我必须在构造函数中初始化一组对象,我想支持所有集合类型,例如Arrays,Maps和Sets。 typeof
只返回Object,似乎没有一个通用Collections
实用程序对象可以提供像Array.isArray()
这样的函数。
来自Java和经典继承样式,我的下一个冲动是检查对象的继承。但是,我对各种原型函数的实验没有发现任何东西。我能想到的最好的方法是创建一个检查.prototype.isPrototypeOf(object)
Map,Set和Array的函数。但那可能是因为我实际上并不了解Javascripts原型继承。
有没有更好的方法来检查某个对象是否是一个集合?
答案 0 :(得分:1)
您可以检查是Iterable
代替:
function isIterable(obj) {
if (obj == null) {
return false;
}
return typeof obj[Symbol.iterator] === 'function';
}
答案 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类型对象,并选择新的答案。