我想知道如何在一个接受单个参数的函数中传递两种不同类型的值。
让函数为function a(b){return c;}
我正在尝试传递一个字符串,同时调用函数a
等一些地方,如a('a string value')
,然后我会用它做一些事情。现在我需要传递一个像a(jquery('#someDiv'))
这样的html元素,然后我会传递另外一些东西。我需要在函数声明中区分它们。
专家有什么想法吗?
提前致谢。
编辑:
我正在寻找一个提示来检查我要传递的数据类型作为函数a
的参数。它可以是字符串,数字或对象,甚至是函数。我不想使用后备。我想通过错误或异常使用最后一个else语句。
答案 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