Check if object is a jQuery object
JavascriptJqueryJavascript Problem Overview
Is there a fast way of checking if an object is a jQuery object or a native JavaScript object?
example:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
obviously, the code above works but it's not safe. You could potentially add a selector key to the o
object and get the same result. Is there a better way of making sure that the object actually is a jQuery object?
Something in line with (typeof obj == 'jquery')
Javascript Solutions
Solution 1 - Javascript
You can use the instanceof
operator:
if (obj instanceof jQuery){
console.log('object is jQuery');
}
Explanation: the jQuery
function (aka $
) is implemented as a constructor function. Constructor functions are to be called with the new
prefix.
When you call $(foo)
, internally jQuery translates this to new jQuery(foo)
1. JavaScript proceeds to initialize this
inside the constructor function to point to a new instance of jQuery
, setting it's properties to those found on jQuery.prototype
(aka jQuery.fn
). Thus, you get a new
object where instanceof jQuery
is true
.
1It's actually new jQuery.prototype.init(foo)
: the constructor logic has been offloaded to another constructor function called init
, but the concept is the same.
Solution 2 - Javascript
You may also use the .jquery property as described here: 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! ');
}
Solution 3 - Javascript
Check out the https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Operators/Special_Operators/Instanceof_Operator">instanceof</a> operator.
var isJqueryObject = obj instanceof jQuery
Solution 4 - Javascript
The best way to check the instance of an object is through instanceof operator or with the method isPrototypeOf() which inspects if the prototype of an object is in another object's prototype chain.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
But sometimes it might fail in the case of multiple jQuery instances on a document. As @Georgiy Ivankin mentioned:
> if I have $
in my current namespace pointing to jQuery2
and I have an object from outer namespace (where $
is jQuery1
) then I have no way to use instanceof
for checking if that object is a jQuery
object
One way to overcome that problem is by aliasing the jQuery object in a closure or IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Other way to overcome that problem is by inquiring the jquery
property in obj
'jquery' in obj
However, if you try to perform that checking with primitive values, it will throw an error, so you can modify the previous checking by ensuring obj
to be an Object
'jquery' in Object(obj)
Although the previous way is not the safest (you can create the 'jquery'
property in an object), we can improve the validation by working with both approaches:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
The problem here is that any object can define a property jquery
as own, so a better approach would be to ask in the prototype, and ensure that the object is not null
or undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Due to coercion, the if
statement will make short circuit by evaluating the &&
operator when obj
is any of the falsy values (null
, undefined
, false
, 0
, ""
), and then proceeds to perform the other validations.
Finally we can write an utility function:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Let's take a look at: Logical Operators and truthy / falsy
Solution 5 - Javascript
However, There is one more way to check the object in jQuery.
jQuery.type(a); //this returns type of variable.
I have made example to understand things, jsfiddle link
Solution 6 - Javascript
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
Solution 7 - Javascript
For those who want to know if an object is a jQuery object without having jQuery installed, the following snippet should do the work :
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
Solution 8 - Javascript
You can check if the object is produced by JQuery with the jquery
property:
myObject.jquery // 3.3.1
=> return the number of the JQuery version if the object produced by JQuery.
=> otherwise, it returns undefined
Solution 9 - Javascript
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE