繁体   English   中英

如何判断给定对象是数组还是对象?

[英]How can one tell whether a given object is an Array or an Object?

好吧,所以这里没什么花哨的,只是一些JSON:

var a = ["foo", "bar", "baz"];

var o = {a: "foo", b: "bar", c: "baz"};

但是,当我们这样做时会发生什么呢?

typeof a; // => "object"

如果我能使该命令说“数组”,我就很喜欢。 但是我不能。 有什么区别的方法吗?

使用instanceof运算符

if (a instanceof Array)

请记住,所有数组都是对象(因为对象位于数组的原型链上),因此要区分必须与Array构造函数进行比较的数组和非Array ,就不能为此使用Object构造函数。

如果您不在多window环境中,则可以检查构造函数...

var isArray = possiblyAnArray.constructor == Array;

...或使用instanceof ...

var isArray = possiblyAnArray instanceof Array;

这些将无法在多window环境中工作,因为不同窗口的Array构造函数将拥有不同的引用。 在这种情况下,您需要以较慢的方式执行此操作...

var isArray = ({}).toString.call(possiblyAnArray) == "[object Array]";

我也看到了另一种方法,该方法很容易实现,但不能保证严格告诉您什么是Array

Array.prototype.isArray = true;
var isArray = [].isArray;

我不建议您使用它,但是看看它是如何工作的很有趣。

您可以检查对象是否为Array的实例:

var isArray = a instanceof Array;

另一种方法是使用鸭子类型。 这取决于用例。

例如,如果您要对数组中的项目进行计数,而这不是您可以在JSON对象中进行的操作,则可以尝试:

if (typeof(obj.length) !=="undefined"){ //do whatever}

这将使您可以选择将代码基于对象属性,而不是基于其真实的类,在某些情况下,它们可能不太相关。

刚刚发现:这有什么问题吗?

var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM