0

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

让一个函数是function a(b){return c;}

我试图在调用函数时传递一个字符串,a比如a('a string value')我会用它做一些事情。现在我需要传递一个 html 元素a(jquery('#someDiv')),然后再传递一些其他的东西。我需要在函数声明中区分两者。

专家有什么想法吗?

提前致谢。

编辑:

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

4

1 回答 1

2

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

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

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

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';
}

* 请注意,即使构造函数“子类化”jQuery(在原型链中与 jQuery 有链接),它也会返回,而instanceof仅当对象的内部指向与 jQuery 构造函数的原型相同的对象时才会返回。当这会有所作为时,这是相当罕见的,但值得牢记。trueObject.getPrototypeOftrue[[Prototype]]

尽管如此,在这些小怪癖中,这个相关问题instanceof作为公认的答案,因为它是最兼容的解决方案。

并且为了解释几件事,jQuery它本身不是构造函数,但它的原型对象与jQuery.fn.init实际构造函数共享,并且jQuery.fn是 的简写jQuery.prototype,所以:

jQuery.fn.init.prototype === jQuery.prototype
jQuery.prototype === jQuery.fn

这已经有点离题了,所以这里有一篇更深入的文章供感兴趣的读者阅读:jQuery 如何将对象实例化为 jQuery.fn.init,以及如果你想继承 jQuery 意味着什么

于 2013-05-23T20:35:51.897 回答