有没有办法知道传递给函数的变量是否是本机对象?我的意思是,我有一个只需要原生对象作为参数的函数,对于每个其他类型的变量,它都会抛出错误。所以:
func(Array); //works
func(String); //works
func(Date); //works
func(Object); //works
...
func([]); //Throwr error
func({}); //Throws error
我想知道是否有办法区分原生对象和其他所有东西。
答案 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
这将提供对用于构造对象的函数的引用