知道变量是否是javascript中的本机对象

时间:2010-05-12 14:21:08

标签: javascript variables native

有没有办法知道传递给函数的变量是否是本机对象?我的意思是,我有一个只需要原生对象作为参数的函数,对于每个其他类型的变量,它都会抛出错误。所以:

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

我想知道是否有办法区分原生对象和其他所有东西。

3 个答案:

答案 0 :(得分:3)

您必须针对接受的值列表(从您的问题中不会那么长)执行===(或!==),并意识到可能会被欺骗认为某些东西不是原生的(只是来自另一个窗口)。

但基本上是:

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

编辑重新评论其他窗口中的内容:请注意,来自一个窗口的构造函数不是===来自另一个窗口(包括iframe)的构造函数,例如:

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

警告“wnd.Array === Array?false”,因为Array中的wnd与您当前的Array不同窗口,即使两者都是数组的内置构造函数。

答案 1 :(得分:2)

据我所知,当前的“最佳实践”方式是获得某种类型的东西

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

那会给你一个看起来像“[object Array]”的字符串。

现在,请记住[]是一个Array实例,而{}是一个Object实例。

答案 2 :(得分:0)

JavaScript中有一个“typeof”运算符可能有所帮助。

alert (typeof arg)

另一种(稍微复杂一点)的方法是使用

arg.prototype.constructor

这将提供对用于构造对象的函数的引用