如何检查函数中传递的参数是字符串还是元素?

时间:2013-05-23 20:22:25

标签: javascript

我想知道如何在一个接受单个参数的函数中传递两种不同类型的值。

让函数为function a(b){return c;}

我正在尝试传递一个字符串,同时调用函数a等一些地方,如a('a string value'),然后我会用它做一些事情。现在我需要传递一个像a(jquery('#someDiv'))这样的html元素,然后我会传递另外一些东西。我需要在函数声明中区分它们。

专家有什么想法吗?

提前致谢。

编辑:

我正在寻找一个提示来检查我要传递的数据类型作为函数a的参数。它可以是字符串,数字或对象,甚至是函数。我不想使用后备。我想通过错误或异常使用最后一个else语句。

1 个答案:

答案 0 :(得分:2)

typeof运算符可用于测试字符串。

if (typeof b == 'string') {
    //handle string
}

第二部分有点棘手。 typeof将为jQuery对象返回object。我相信使用Object.getPrototypeOf检查对象的[[Prototype]]是否与jQuery构造函数的原型相同是足够安全的:

else if (Object.getPrototypeOf(b) === $.fn) {
    //it is an object that inherits from the jQuery prototype
}

但是在IE< 9中不支持。如果需要回退,instanceof会产生类似的效果,可以代替Object.getPrototypeOf使用:

else if (b instanceof jQuery) {}

这是一个老IE支持的完整解决方案:

if (typeof b == 'string') {
    //handle string
} else if (b instanceof jQuery) {
    //handle jQuery object
} else {
    throw 'Invalid argument';
}

*请注意instanceof即使构造函数“子类化”jQuery(原型链中的链接为jQuery)也会返回true,而Object.getPrototypeOf只会返回true如果对象的内部[[Prototype]]指向与jQuery构造函数原型相同的对象。如果这会产生影响,那是相当罕见的,但值得记住。

尽管有这些小问题,但related question已将instanceof作为已接受的答案,因为它是最兼容的解决方案。

为了解释一些事情,jQuery本身不是构造函数,但它的原型对象与jQuery.fn.init共享,它是实际的构造函数,而jQuery.fn是{的简写{ {1}},所以:

jQuery.prototype

这已经有点偏离主题了,所以这里有一篇更深入的文章给感兴趣的读者:How jQuery instantiates objects as jQuery.fn.init, and what that means if you want to subclass jQuery