好吧,这里没什么特别的,只是一些 JSON:
var a = ["foo", "bar", "baz"];
var o = {a: "foo", b: "bar", c: "baz"};
但是当我们这样做时会发生什么?
typeof a; // => "object"
如果我可以让那个命令说“数组”,我会喜欢它。但我不能。有什么方法可以区分吗?
好吧,这里没什么特别的,只是一些 JSON:
var a = ["foo", "bar", "baz"];
var o = {a: "foo", b: "bar", c: "baz"};
但是当我们这样做时会发生什么?
typeof a; // => "object"
如果我可以让那个命令说“数组”,我会喜欢它。但我不能。有什么方法可以区分吗?
if (a instanceof 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";