我从jQuery本机代码中获取以下表达式:
handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || []
我很好奇在哪个条件下,表达式的最后部分 - []
- 将被分配给handlers
变量?这是我的推测:
1)此部分首先执行( jQuery._data( this, "events" ) || {} )
。如果没有附加事件jQuery._data( this, "events" ) === undefined
,则返回空对象。
2)然后处理此部分{}[event.type] || []
。如果未定义event.type
,则返回一个数组并将其分配给handlers
变量。所以这意味着对于要返回的数组,event.type
未定义就足够了吗?
我是对的吗?
答案 0 :(得分:2)
这基本上是正确的
它只是想做到这一点。
jQuery._data(this, "events")[event.type] || []
但是,如果jQuery._data(this, "events")
为falsey(未定义),则他们首先将其设置为{}
,以便[event.type]
对象属性访问器不会抛出拟合。
写这个的另一种方法可能是
handlers = (function(context){
var events = jQuery._data(context, "events") || {};
return events[event.type] || [];
})(this);
答案 1 :(得分:1)
所以这意味着要返回数组,
event.type
是undefined
就足够了吗?
是的,但如果event.type
的值在对象中不存在作为属性名称,则也会返回该数组。也就是说,如果第一个表达式求值为空对象,则 event.type
的任何值将导致返回该数组。
示例:
({}['click'] || [])
答案 2 :(得分:1)
jQuery._data( this, "events" ) === undefined
,则返回空对象。” 如果||
调用返回null,0或false,逻辑jQuery._data(this, 'events') || {})
(OR)也将评估给定表达式(_data
到空对象文字...任何虚假的价值,基本上。
是的,在jQuery._data(this, 'events')
或emtpy对象文字的返回值中未定义(在这种情况下它几乎肯定是未定义的),这将评估为一个空数组,这就是{{将分配1}}。
如果你是疯狂的,并且在Object原型上设置了一个属性,原因是:
handlers
您的代码永远不会为Object.prototype.click = 'I was set by a madman';
事件类型返回一个空数组,因为属性click
将始终,无论如何在实例上,或进一步上升原型链。这就是为什么你应该永远不要触摸原生原型,除了一些罕见的情况。即使这样,也不要在click