检查对象是否为 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';
}
我必须在构造函数中初始化一个对象集合,我想支持所有集合类型,例如 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';
}