2010-05-12 57 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 

这会给引用这是用于构建对象

相关问题