簡體   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