我們知道,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>&& 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