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

时间:2012-09-06 11:39:30

标签: javascript arrays object typing

好吧,这里没什么好看的,只是一些JSON:

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

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

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

typeof a; // => "object"

如果我能得到那个说“阵”的命令,我会喜欢它。但我不能。有没有办法区分?

5 个答案:

答案 0 :(得分:3)

使用instanceof operator

if (a instanceof Array)

请记住,所有数组都是对象(因为对象在数组的原型链上),所以为了区分数组和非数组,你需要与Array构造函数进行比较,你不能使用这个Object构造函数。

答案 1 :(得分:2)

如果您不在多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;

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

答案 2 :(得分:1)

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

var isArray = a instanceof Array;

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

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