好吧,这里没什么好看的,只是一些JSON:
var a = ["foo", "bar", "baz"];
var o = {a: "foo", b: "bar", c: "baz"};
但是当我们这样做时会发生什么?
typeof a; // => "object"
如果我能得到那个说“阵”的命令,我会喜欢它。但我不能。有没有办法区分?
答案 0 :(得分:3)
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";