该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 构造函数的原型相同的对象时才会返回。当这会有所作为时,这是相当罕见的,但值得牢记。true
Object.getPrototypeOf
true
[[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 意味着什么