当表达式的最后一部分将被返回

时间:2013-08-26 07:58:18

标签: javascript jquery

我从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未定义就足够了吗?

我是对的吗?

3 个答案:

答案 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.typeundefined就足够了吗?

是的,但如果event.type的值在对象中不存在作为属性名称,则也会返回该数组。也就是说,如果第一个表达式求值为空对象,则 event.type的任何值将导致返回该数组。

示例:

({}['click'] || [])

答案 2 :(得分:1)

  • “如果没有附加事件jQuery._data( this, "events" ) === undefined,则返回空对象。”

如果||调用返回null,0或false,逻辑jQuery._data(this, 'events') || {})(OR)也将评估给定表达式(_data到空对象文字...任何虚假的价值,基本上。

  • “所以这意味着对于要返回的数组,event.type未定义就足够了”

是的,在jQuery._data(this, 'events')或emtpy对象文字的返回值中未定义(在这种情况下它几乎肯定是未定义的),这将评估为一个空数组,这就是{{将分配1}}。

如果你是疯狂的,并且在Object原型上设置了一个属性,原因是:

handlers

您的代码永远不会Object.prototype.click = 'I was set by a madman'; 事件类型返回一个空数组,因为属性click始终,无论如何在实例上,或进一步上升原型链。这就是为什么你应该永远不要触摸原生原型,除了一些罕见的情况。即使这样,也不要在click

上设置非功能属性