关于javascript:检查对象是否为jquery对象

Check if object is a jQuery object

是否有快速的方法来检查对象是jquery对象还是本机javascript对象?

例子:

1
2
3
4
5
6
7
8
9
10
11
var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

显然,上面的代码有效,但不安全。您可能会向o对象添加一个选择器键,得到相同的结果。是否有更好的方法来确保对象实际上是jquery对象?

(typeof obj == 'jquery')一致的东西


您可以使用instanceof操作符:

1
obj instanceof jQuery

说明:jQuery函数(又称$函数)作为构造函数实现。使用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/

1
2
3
4
5
6
7
8
9
10
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运算符。

1
var isJqueryObject = obj instanceof jQuery

检查对象实例的最佳方法是通过InstanceOf运算符或方法IsPrototypeOf(),该方法检查对象的原型是否在另一个对象的原型链中。

1
2
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

但有时在一个文档上有多个jquery实例的情况下,它可能会失败。正如@georgiy ivankin提到的:

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

解决这个问题的一种方法是将jquery对象别名为闭包或IIFE

1
2
3
4
5
6
7
8
9
10
//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

解决这个问题的另一种方法是询问obj中的jQuery财产。

1
'jquery' in obj

但是,如果您尝试使用原语值执行该检查,它将抛出一个错误,因此您可以通过确保objObject来修改以前的检查。

1
'jquery' in Object(obj)

虽然前面的方法不是最安全的(您可以在一个对象中创建'jquery'属性),但是我们可以通过使用这两种方法来改进验证:

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

这里的问题是,任何对象都可以将属性jQuery定义为自己的,因此更好的方法是在原型中询问,并确保对象不是nullundefined

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

由于胁迫,当obj为任意一个错误值(nullundefinedfalse0""时,if语句将通过评估&&运算符来短路,然后继续进行其他验证。

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

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

让我们看一下:逻辑运算符和truthy/falsy


但是,还有一种方法可以检查jquery中的对象。

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

我举了个例子来理解事物,jfiddle链接


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


对于那些想知道一个对象是否是一个没有安装jquery的jquery对象的人,下面的代码段应该完成这项工作:

1
2
3
4
function isJQuery(obj) {
  // Each jquery object has a"jquery" attribute that contains the version of the lib.
  return typeof obj ==="object" && obj && obj["jquery"];
}

您可以检查对象是否由jquery使用jQuery属性生成:

1
myObject.jquery // 3.3.1

=>如果jquery生成的对象,则返回jquery版本号。=>否则返回undefined


1
2
3
4
5
6
7
8
var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE