0

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

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

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

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

typeof a; // => "object"

如果我可以让那个命令说“数组”,我会喜欢它。但我不能。有什么方法可以区分吗?

4

5 回答 5

3

使用instanceof运算符

if (a instanceof Array)

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

于 2012-09-06T11:41:05.480 回答
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;

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

于 2012-09-06T11:41:12.053 回答
1

您可以检查对象是否是以下实例Array

var isArray = a instanceof Array;
于 2012-09-06T11:43:32.370 回答
0

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

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

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

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

于 2012-09-06T11:45:54.843 回答
0

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

var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";
于 2012-09-06T11:46:20.330 回答