检查对象是否是一个jQuery对象

有没有一种快速的方法来检查一个对象是一个jQuery对象还是一个本地JavaScript对象?

例:

var o = {}; var e = $('#element'); function doStuff(o) { if (o.selector) { console.log('object is jQuery'); } } doStuff(o); doStuff(e); 

显然,上面的代码工作,但不安全。 您可以将select键添加到o对象并获得相同的结果。 有没有更好的方法确保对象实际上是一个jQuery对象?

一些符合(typeof obj == 'jquery')

你可以使用instanceof操作符:

 obj instanceof jQuery 

说明jQuery函数(aka $ )是作为构造函数实现的 。 构造函数将使用new前缀进行调用。

当你调用$(foo) ,内部的jQuery把它翻译成new jQuery(foo) 1 。 JavaScript继续在构造函数中初始化this指向jQuery一个新实例,将其设置为jQuery.prototype (也称为jQuery.fn )上的属性。 因此,你得到一个new对象instanceof jQuerytrue


1 它实际上是new jQuery.prototype.init(foo) :构造函数逻辑已被卸载到另一个名为init构造函数,但概念是相同的。

您也可以使用如下所述的.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! '); } 

查看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 

其他解决这个问题的方法是通过查询objjquery属性

 'jquery' in obj 

但是,如果您尝试使用原始值执行该检查,则会引发错误,因此您可以通过确保objObject来修改以前的检查

 'jquery' in Object(obj) 

虽然以前的方法并不是最安全的(可以在对象中创build'jquery'属性),但是我们可以通过使用两种方法来改进validation:

 if (obj instanceof jQuery || 'jquery' in Object(obj)) { } 

这里的问题是,任何对象可以定义一个属性jquery作为自己的,所以更好的方法是要求在原型,并确保该对象不是nullundefined

 if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { } 

由于强制 ,当obj是任何一个falsy值( nullundefinedfalse0"" )时, if语句会通过评估&&运算符来短路,然后继续执行其他validation。

最后我们可以编写一个实用函数:

 function isjQuery(obj) { return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)); } 

让我们看看: 逻辑运算符和真/假

 return el instanceof jQuery ? el.size() > 0 : (el && el.tagName); 

但是,还有一种方法来检查jQuery中的对象。

 jQuery.type(a); //this returns type of variable. 

我做了个例子来理解事物, jsfiddle链接

 var elArray = []; var elObjeto = {}; elArray.constructor == Array //TRUE elArray.constructor == Object//TALSE elObjeto.constructor == Array//FALSE elObjeto.constructor == Object//TRUE