Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查对象是否为jQuery对象_Javascript_Jquery - Fatal编程技术网

Javascript 检查对象是否为jQuery对象

Javascript 检查对象是否为jQuery对象,javascript,jquery,Javascript,Jquery,是否有一种快速检查对象是jQuery对象还是本机JavaScript对象的方法 例如: var o = {}; var e = $('#element'); function doStuff(o) { if (o.selector) { console.log('object is jQuery'); } } doStuff(o); doStuff(e); 显然,上面的代码可以工作,但并不安全。您可能会向o对象添加一个选择器键,并获得相同的结果。有没有更好的

是否有一种快速检查对象是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”)一致的内容

您可以使用运算符:

if (obj instanceof jQuery){
    console.log('object is jQuery');
}
解释:将
jQuery
函数(aka
$
)作为。构造函数将使用
new
前缀调用

当您调用
$(foo)
时,jQuery会在内部将其转换为
newjQuery(foo)
1。JavaScript继续在构造函数中初始化
这个
,指向
jQuery
的新实例,将其属性设置为
jQuery.prototype
(aka
jQuery.fn
)上的属性。因此,您将得到一个
新的
对象,其中jQuery的
实例
true


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

查看操作符

var isJqueryObject = obj instanceof jQuery

您还可以使用.jquery属性,如下所述:


检查对象实例的最佳方法是通过操作符或使用检查对象原型是否在另一个对象的原型链中的方法。

jQuery的obj实例; jQuery.prototype.isPrototypeOf(obj); 但有时,如果一个文档上有多个jQuery实例,它可能会失败。正如@Georgiy Ivankin提到的:

如果我在当前命名空间中有指向
jQuery2
$
,并且我有一个来自外部命名空间的对象(其中
$
jQuery1
),那么我无法使用
instanceof
检查该对象是否是
jQuery
对象

克服该问题的一种方法是将jQuery对象别名为

//将jQuery别名为$
(函数($,未定义){
/*…您的代码*/
log(obj instanceof$);
log($.prototype.isPrototypeOf(obj));
/*…您的代码*/
}(jQuery1));
//进口jQuery1
克服该问题的另一种方法是查询
obj

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

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

if(对象(obj)中jQuery | |'jQuery'的obj实例){
这里的问题是,任何对象都可以将属性
jquery
定义为自己的,因此更好的方法是在原型中询问,并确保该对象不是
null
未定义的

if(obj&&(obj instanceof jQuery | | obj.constructor.prototype.jQuery)){
由于强制
if
语句将在
obj
是任何falsy值(
null
未定义
false
0
)时,通过评估
运算符而产生短路,然后继续执行其他验证

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

函数isjQuery(obj){
返回(obj&(obj instanceof jQuery | | obj.constructor.prototype.jQuery));
}


让我们看一看:

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

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

我举了一个例子来理解一些事情,

对于那些想知道一个对象是否是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"];
}

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

myObject.jquery // 3.3.1
=>返回JQuery版本号,如果该对象是由JQuery生成的。
=>否则,它将返回问题中指出的
未定义的

,检查值可能为null的变量的属性(即如果“a”或“b”为null)是不安全的(它将抛出类型错误)。使用“b instanceof jQuery”更好。如果jQuery没有加载,这种方法可以工作,而
b instanceof jQuery
如果jQuery在页面上不可用,则抛出一个引用错误。这两种方法在不同的情况下都很有用。可能更有效,但仍然不安全。它可能需要
尝试。。。catch
,尤其是在旧版本中。如果可能没有加载jQuery,则可以使用
if((jQuery的类型!=='undefined')&&(jQuery的obj实例)){…
这不是一个很好的例子。{code>a
很可能是一个DOM节点,比如
document.body
,然后,理论上有可能
jquery
键不知何故出现在该节点链的顶端。那么你的意思是
if(obj instanceof jquery){…}
?@NigelAngel:是的,这就是他的意思:)如果一个页面上有多个jQuery实例,这是不起作用的。@CrescentFresh我的意思是,如果我当前命名空间中有$指向jQuery2,而我有一个来自外部命名空间的对象(其中$是jQuery1)因此,我无法使用instanceof检查此对象是否为jQuery对象。如果您不确定在执行if语句时是否加载了jQuery,则可以将检查扩展为
typeof jQuery==='function'&&obj instanceof jQuery
,因为
jQuery
不必为
typeof声明e> 接线员到
jQuery.type(a); //this returns type of variable.
function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}
myObject.jquery // 3.3.1