检查对象是否为jQuery对象


601

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

例:

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')


3
从jQuery 3.0开始,这绝对不是检查对象是否为jQuery对象的正确方法,因为该selector属性很久以前就已弃用并在3.0中删除。即使在早期版本中,jQuery对象也可以具有空的选择器字符串,例如$(window),没有选择器。使用instanceof代替。
Dave Methvin

Answers:


878

您可以使用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 jQuerytrue


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


8
所以,你的意思是if (obj instanceof jQuery){...}
奈杰尔·天使

2
@NigelAngel:是的,这就是他的意思:)
ChaseMoskal

12
如果页面上有多个jQuery实例,则此方法不起作用。
Georgii Ivankin

5
@CrescentFresh我的意思是,如果我当前的命名空间中有$指向jQuery2,并且我有一个来自外部命名空间的对象(其中$是jQuery1),则我无法使用instanceof来检查此对象是否为jQuery对象。
Georgii Ivankin

6
如果不确定在if语句时是否已加载jQuery,则可以将check扩展为,typeof jQuery === 'function' && obj instanceof jQuery因为jQuery不必声明该值即可使typeof操作符正常工作而不会引发错误。
Patrick Roberts

105

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

12
正如David在问题中指出的那样,检查值可能为null的变量的属性(即,如果“ a”或“ b”为null)是不安全的(它将引发TypeError)。使用“ b instanceof jQuery”更好。
rstackhouse 2012年

23
如果未加载jQuery,则此方法有效,而b instanceof jQuery如果jQuery在页面上不可用,则抛出ReferenceError。两种方法在不同情况下都是有用的。
Nate

也许更有效,但仍然不安全。可能需try ... catch要这样做,尤其是在oldIE中。
ClarkeyBoy

如果有可能未加载jQuery,则可以使用if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
Harry Pehkonen15年

那不是一个很好的例子。更可能a是一个DOM节点,例如document.body,从理论上讲,这个jquery密钥有可能以某种方式出现在该节点的链上。
vsync


26

检查对象实例的最佳方法是通过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

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

'jquery' in Object(obj)

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

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

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

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

由于强制,该if语句将通过评估使短路&&时操作者obj是任何的falsy值(nullundefinedfalse0""),然后前进到执行其他的验证。

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

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

让我们看一下:逻辑运算符和真实/错误


但是,如何提高安全性?具有jquery属性的非jQuery对象仍然会被错误检测。我看不到同时使用这两种方法还能“改善”什么。
GuiPrá15年

这是一种检查对象是否为jQuery对象的简便方法,如果由于某种原因您怀疑某人正在创建具有诸如jquery之类的属性的对象,则可以创建更可靠的验证器,即检查原型中的 属性myObj .constructor.prototype.jquery或更高版本,您可以使用函数Object.prototype.isPrototypeOf()
jherax 2015年

1
但是,如果您||使用'jquery' in Object(obj),将耗尽所有资源,因为它不会阻止具有该属性的非jQuery对象通过验证。我确实相信在原型中检查该属性可以改善这种情况。也许您应该将其添加到您的答案中!我认为这里没有其他答案提及这种可能性了:)
GuiPrá15年

1
不是obj.__proto__.jquery的,而不是obj.constructor.prototype.jquery就够了吗?有点短:)
Axel

1
@Axel是的,它也有效:)。我使用过,constructor.prototype因为obj应该是构造函数的一个实例,即jQuery。另一方面__proto__,可用于任何种类的对象。
jherax '17

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

要检查DOM元素,更好地使用nodeType属性,并确保boolean返回值,可以使用双重否定法!!(el && el.nodeType)
jherax 2014年


2

对于那些想知道一个对象是否是一个jQuery对象而没有安装jQuery的人,以下代码片段应该可以完成工作:

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

1

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

myObject.jquery // 3.3.1

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


-9
var elArray = [];
var elObjeto = {};

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

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

11
没有解释的代码转储很少有用。请考虑在您的答案中添加一些上下文。
克里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.