【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
有没有快速检查对象是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')
#1楼
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
#2楼
您可以使用instanceof
运算符:
obj instanceof jQuery
说明 : jQuery
函数(又名$
)是作为构造函数实现的 。 使用new
前缀调用构造函数。
当你调用$(foo)
,内部jQuery会将其转换为new jQuery(foo)
1 。 JavaScript继续在构造函数内初始化this
以指向jQuery
的新实例,将其属性设置为jQuery.prototype
(aka jQuery.fn
)上的属性。 因此,您将获得一个new
对象,其中instanceof jQuery
为true
。
1它实际上是new jQuery.prototype.init(foo)
:构造函数逻辑已被卸载到另一个名为init
构造函数,但概念是相同的。
#3楼
查看instanceof运算符。
var isJqueryObject = obj instanceof jQuery
#4楼
检查对象实例的最佳方法是通过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
克服该问题的其他方法是通过查询obj
的jquery
属性
'jquery' in obj
但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保obj
成为Object
来修改先前的检查
'jquery' in Object(obj)
虽然前面的方法不是最安全的(您可以在对象中创建'jquery'
属性),但我们可以通过使用这两种方法来改进验证:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是任何对象都可以将属性jquery
定义为自己的,因此更好的方法是在原型中询问,并确保该对象不为null
或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
由于强制 ,当obj
是任何伪值( null
, undefined
, false
, 0
, ""
)时, if
语句将通过评估&&
运算符来进行短路,然后继续执行其他验证。
最后我们可以编写一个实用函数:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
让我们来看看: 逻辑运算符和truthy / falsy
#5楼
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3153483