何时返回表达式的最后一部分

When the last part of expression will be returned

本文关键字:最后 一部分 表达式 返回 何时      更新时间:2023-09-26

我有以下来自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是未定义的就足够了?

我说得对吗?

这基本上是正确的

它只是想这么做。

jQuery._data(this, "events")[event.type] || []

但是,如果jQuery._data(this, "events")为false(未定义),他们会先将其设置为{},这样[event.type]对象属性访问器就不会引发拟合。


另一种写法可能是

handlers = (function(context){
  var events = jQuery._data(context, "events") || {};
  return events[event.type] || [];    
})(this);

所以这意味着对于要返回的数组来说,event.type就是undefined就足够了?

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

示例:

({}['click'] || [])
  • 如果没有附加事件jQuery._data( this, "events" ) === undefined,则返回空对象

几乎,如果_data调用返回null、0或false…基本上是任何错误值,逻辑||(OR)也会将给定表达式(jQuery._data(this, 'events') || {}))求值为空对象文字

  • "因此,这意味着要返回数组,event.type未定义就足够了"

是的,无论是在jQuery._data(this, 'events')的返回值中还是在emtpy对象文字中(在这种情况下,它几乎肯定是未定义的),它都将计算为一个空数组,这就是handlers将被分配的。

如果你疯了,出于某种原因在Object原型上设置了一个属性:

Object.prototype.click = 'I was set by a madman';

您的代码永远不会为click事件类型返回空数组,因为无论是在实例上还是在原型链的更高层,都会发现属性click。这就是为什么你永远不应该接触原生原型,除了一些罕见的情况。即便如此,也不要在Object.prototype 上设置非函数属性