天天看點

(轉)JavaScript中判斷對象類型的種種方法

我們知道,javascript中檢測對象類型的運算符有:typeof、instanceof,還有對象的constructor屬性: 1) typeof

運算符 typeof

是一進制運算符,傳回結果是一個說明運算數類型的字元串。如:"number","string","boolean","object","function","undefined"(可用于判斷變量是否存在)。

但 typeof 的能力有限,其對于date、regexp類型傳回的都是"object"。如:

1

2

3

<code>typeof</code> <code>{};</code><code>// "object"</code>

<code>typeof</code> <code>[];</code><code>// "object"</code>

<code>typeof</code> <code>new</code> <code>date();</code><code>// "object"</code>

是以它隻在差別對象和原始類型的時候才有用。要區一種對象類型和另一種對象類型,必須使用其他的方法。如:instanceof 運算符或對象的

constructor 屬。 2)instanceof 運算符。 instanceof

運算符要求其左邊的運算數是一個對象,右邊的運算數是對象類的名字或構造函數。如果 object 是 class 或構造函數的執行個體,則 instanceof

運算符傳回 true。如果 object 不是指定類或函數的執行個體,或者 object 為 null,則傳回 false。如:

4

<code>[]</code><code>instanceof</code> <code>array;</code><code>// true</code>

<code>[]</code><code>instanceof</code> <code>object;</code><code>// true</code>

<code>[]</code><code>instanceof</code> <code>regexp;</code><code>// false</code>

<code>new</code> <code>date</code><code>instanceof</code> <code>date;</code><code>// true</code>

是以,可以用instanceof運算符來判斷對象是否為數組類型:

<code>function</code> <code>isarray(arr){</code>

<code>    </code><code>return</code> <code>arr</code><code>instanceof</code> <code>array;</code>

<code>}</code>

3)constructor 屬性。

javascript中,每個對象都有一個constructor屬性,它引用了初始化該對象的構造函數,常用于判斷未知對象的類型。如給定一個求知的值

通過typeof運算符來判斷它是原始的值還是對象。如果是對象,就可以使用constructor屬性來判斷其類型。是以判斷數組的函數也可以這樣寫:

<code>    </code><code>return</code> <code>typeof</code> <code>arr ==</code><code>"object"</code> <code>&amp;&amp; arr.constructor == array;</code>

很多情況下,我們可以使用instanceof運算符或對象的constructor屬性來檢測對象是否為數組。例如很多javascript架構就是使用這兩種方法來判斷對象是否為數組類型。

但是檢測在跨架構(cross-frame)頁面中的數組時,會失敗。原因就是在不同架構(iframe)中建立的數組不會互相共享其prototype屬性。例如:

在ajaxian上看到了一種精确的檢測方法,跨原型鍊調用tostring()方法:object.prototype.tostring()。可以解決上面的跨架構問題。

當object.prototype.tostring(o)執行後,會執行以下步驟: 1)擷取對象o的class屬性。 2)連接配接字元串:"[object

"+結果(1)+"]" 3)傳回 結果(2) 例如:

這樣,我們就可以寫一個健壯的判斷對象是否為數組的函數:

此種方法得到國外多個javascript大師的認可,在即将釋出的jquery 1.3中将使用這種方法來檢測數組。

prototype.js的一個維護者寫了下面這個函數,用于擷取對象的類型名

擴充一下,用于檢測各種對象類型:

轉載自:http://www.cnblogs.com/flyjs/archive/2012/02/20/2360504.html