Answers:
您可以使用instanceof
运算符:
if (obj instanceof jQuery){
console.log('object is jQuery');
}
说明:jQuery
函数(又名$
)被实现为构造函数。构造函数将以new
前缀调用。
当您调用时$(foo)
,内部jQuery将此转换为new jQuery(foo)
1。JavaScript继续this
在构造函数内部进行初始化,以指向的新实例jQuery
,并将其属性设置为jQuery.prototype
(aka jQuery.fn
)上的属性。因此,您得到的new
对象instanceof jQuery
是true
。
1 实际上new jQuery.prototype.init(foo)
:构造函数逻辑已被卸载到另一个名为的构造函数中init
,但是概念是相同的。
if (obj instanceof jQuery){...}
?
typeof jQuery === 'function' && obj instanceof jQuery
因为jQuery
不必声明该值即可使typeof
操作符正常工作而不会引发错误。
您还可以按如下所述使用.jquery属性:http ://api.jquery.com/jquery-2/
var a = { what: "A regular JS object" },
b = $('body');
if ( a.jquery ) { // falsy, since it's undefined
alert(' a is a jQuery object! ');
}
if ( b.jquery ) { // truthy, since it's a string
alert(' b is a jQuery object! ');
}
b instanceof jQuery
如果jQuery在页面上不可用,则抛出ReferenceError。两种方法在不同情况下都是有用的。
try ... catch
要这样做,尤其是在oldIE中。
if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
是一个DOM节点,例如document.body
,从理论上讲,这个jquery
密钥有可能以某种方式出现在该节点的链上。
检出instanceof运算子。
var isJqueryObject = obj instanceof jQuery
检查对象实例的最佳方法是通过instanceof运算符或使用isPrototypeOf()方法,该方法检查对象的原型是否在另一个对象的原型链中。
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
但是有时在一个文档上有多个jQuery实例的情况下它可能会失败。正如@Georgiy Ivankin所提到的:
如果我有
$
我当前名字空间指向jQuery2
和我有一个从外部命名空间(其中一个对象$
是jQuery1
),那我也没办法使用instanceof
的检查,如果对象是一个jQuery
对象
解决该问题的一种方法是在闭包或IIFE中为jQuery对象添加别名
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
其他与解决这一问题的方法是通过询问jquery
物业obj
'jquery' in obj
但是,如果您尝试使用原始值执行该检查,则会引发错误,因此您可以通过确保obj
将Object
'jquery' in Object(obj)
尽管前一种方法不是最安全的方法(您可以'jquery'
在对象中创建属性),但是我们可以通过使用两种方法来改进验证:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是,任何对象都可以定义一个属性jquery
作为自己的,所以更好的办法是问原型,并确保对象不是null
或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
由于强制,该if
语句将通过评估使短路&&
时操作者obj
是任何的falsy值(null
,undefined
,false
,0
,""
),然后前进到执行其他的验证。
最后,我们可以编写一个实用程序函数:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
让我们看一下:逻辑运算符和真实/错误
||
使用'jquery' in Object(obj)
,将耗尽所有资源,因为它不会阻止具有该属性的非jQuery对象通过验证。我确实相信在原型中检查该属性可以改善这种情况。也许您应该将其添加到您的答案中!我认为这里没有其他答案提及这种可能性了:)
obj.__proto__.jquery
的,而不是obj.constructor.prototype.jquery
就够了吗?有点短:)
constructor.prototype
因为obj
应该是构造函数的一个实例,即jQuery
。另一方面__proto__
,可用于任何种类的对象。
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
nodeType
属性,并确保boolean
返回值,可以使用双重否定法!!(el && el.nodeType)
您可以使用jquery
属性检查对象是否由JQuery生成:
myObject.jquery // 3.3.1
=>如果JQuery生成的对象返回JQuery版本号。=>否则返回undefined
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
selector
属性很久以前就已弃用并在3.0中删除。即使在早期版本中,jQuery对象也可以具有空的选择器字符串,例如$(window)
,没有选择器。使用instanceof
代替。