2010-05-12 98 views
2

有沒有辦法知道傳入函數的變量是否是本機對象?我的意思是,我有一個函數只需要本地對象作爲參數,對於其他類型的變量,它會引發錯誤。所以:知道一個變量是否是javascript中的本地對象

func(Array); //works 
func(String); //works 
func(Date); //works 
func(Object); //works 
... 
func([]); //Throwr error 
func({}); //Throws error 

我想知道是否有方法來區分本機對象和其他一切。

+1

JavaScript是很肉麻的功能。另外,'[]'*是一個數組。 – Pointy 2010-05-12 14:23:29

+0

是的,但數組是一個函數,因爲它是數組對象的構造函數 – mck89 2010-05-12 14:25:17

+0

哦,我看到了 - 你想對構造函數本身進行操作。 – Pointy 2010-05-12 14:26:08

回答

3

你必須做一個===(或!==)對接受值列表(這將不會很長,從你的問題),意識到這可能被欺騙,認爲事情不是一個(原來是從另一個窗口)。

但基本上是:

if (obj !== Array && 
    obj !== String && 
    obj !== Date && 
    /* ...and so on, there are only a few of them... */ 
    ) { 
    throw "your error"; 
} 

編輯回覆我從其他窗口的東西註釋:請注意,從一個窗口構造不===來構造從另一個窗口(包括I幀),例如:

var wnd = window.open('blank.html'); 
alert("wnd.Array === Array? " + (wnd.Array === Array)); 

警報「wnd.Array ===陣?假」,因爲在wndArray不是TH與當前窗口中的Array相同,即使它們都是數組的內置構造函數。

+0

我不知道你可以做這種類型的比較,謝謝。所以我認爲這是唯一的方法嗎?沒有辦法對每個構造函數執行通用檢查? – mck89 2010-05-12 14:35:31

+0

@ mck89:據我所知,不,沒有捷徑。 (順便說一句,我編輯我的答案,以更好地解釋窗口的事情。) – 2010-05-12 15:12:32

+0

這是我收到的最全面的答案,謝謝:) – mck89 2010-05-12 15:29:36

2

據我所知,目前的「最佳實踐」的方式來獲得的東西類型是

var theType = Object.prototype.toString.call(theObject); 

這會給你一個字符串,它看起來像「[對象數組]」。

現在請記住,[]是一個Array實例,而{}是一個Object實例。

+0

如果你嘗試使用本機對象,你總會得到[對象函數],因爲它們都是函數,所以沒有辦法區分它們,因爲每一個函數都有相同的結果。 – mck89 2010-05-12 14:28:24

+0

好的 - 我在誤解你的問題。當您看到您真正感興趣的是創建本地對象的構造函數集合時,您的問題標題會詢問「本機對象」。見Crowder先生的回答。 – Pointy 2010-05-12 14:31:15

0

JavaScript中有一個「typeof」運算符可能有幫助。

alert (typeof arg) 

其他(有點更復雜)的方法是使用

arg.prototype.constructor 

這會給引用這是用於構建對象

相關問題