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

Javascript 何时返回表达式的最后一部分,javascript,jquery,Javascript,Jquery,以下表达式取自jQuery本机代码: handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [] 我很好奇在什么条件下表达式的最后一部分-[]-将被分配给处理程序变量?以下是我的猜测: 1) 这一部分首先执行(jQuery._data(这是“事件”)| |{})。如果没有附加的事件jQuery.\u数据(此“事件”)===未定义的,则返回空对象 2) 然后处理此部分{}[event.type]| |[]。如果未

以下表达式取自jQuery本机代码:

handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || []
我很好奇在什么条件下表达式的最后一部分-
[]
-将被分配给
处理程序
变量?以下是我的猜测:

1) 这一部分首先执行
(jQuery._data(这是“事件”)| |{})
。如果没有附加的事件
jQuery.\u数据(此“事件”)===未定义的
,则返回空对象

2) 然后处理此部分
{}[event.type]| |[]
。如果未定义
event.type
,则返回一个数组并将其分配给
处理程序
变量。这意味着对于要返回的数组来说,
event.type
未定义就足够了

我说得对吗

因此,这意味着对于要返回的数组,
event.type
undefined

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

例如:

({}['click'] || [])
因此,这意味着对于要返回的数组,
event.type
undefined

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

例如:

({}['click'] || [])
基本上是这样

它只是想这么做

jQuery._data(this, "events")[event.type] || []
但是,如果
jQuery.\u数据(这是“事件”)
是错误的(未定义),他们首先将其设置为
{}
,以便
[event.type]
对象属性访问器不会抛出匹配


写这篇文章的另一种方式可能是

handlers = (function(context){
  var events = jQuery._data(context, "events") || {};
  return events[event.type] || [];    
})(this);
基本上是这样

它只是想这么做

jQuery._data(this, "events")[event.type] || []
但是,如果
jQuery.\u数据(这是“事件”)
是错误的(未定义),他们首先将其设置为
{}
,以便
[event.type]
对象属性访问器不会抛出匹配


写这篇文章的另一种方式可能是

handlers = (function(context){
  var events = jQuery._data(context, "events") || {};
  return events[event.type] || [];    
})(this);
  • 如果没有附加的事件
    jQuery.\u数据(此“事件”)===未定义的
    ,则返回空对象
几乎,如果
|
调用返回null、0或false,则逻辑
|
(OR)也会将给定表达式(
jQuery._data(this,'events')|{})
求值为空对象文本。。。基本上,任何虚假的价值

  • “因此,这意味着对于要返回的数组来说,event.type未定义就足够了”
是的,无论是在
jQuery.\u data的返回值中未定义它(这是“事件”)
还是在emtpy对象文本中(在这种情况下,它几乎肯定是未定义的),它都将计算为空数组,这就是
处理程序
将被分配的内容

如果您完全疯了,并且出于某种原因在对象原型上设置了属性:

Object.prototype.click = 'I was set by a madman';
您的代码永远不会为
click
事件类型返回空数组,因为属性
click
始终会被找到,无论是在实例上还是原型链的更上层。这就是为什么除了一些罕见的情况外,你永远不应该接触原生原型。即使如此,也不要在
对象.prototype上设置非函数属性
  • 如果没有附加的事件
    jQuery.\u数据(此“事件”)===未定义的
    ,则返回空对象
  • 几乎,如果
    |
    调用返回null、0或false,则逻辑
    |
    (OR)也会将给定表达式(
    jQuery._data(this,'events')|{})
    求值为空对象文本。。。基本上,任何虚假的价值

    • “因此,这意味着对于要返回的数组来说,event.type未定义就足够了”
    是的,无论是在
    jQuery.\u data的返回值中未定义它(这是“事件”)
    还是在emtpy对象文本中(在这种情况下,它几乎肯定是未定义的),它都将计算为空数组,这就是
    处理程序
    将被分配的内容

    如果您完全疯了,并且出于某种原因在对象原型上设置了属性:

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

    您的代码永远不会为
    click
    事件类型返回空数组,因为属性
    click
    始终会被找到,无论是在实例上还是原型链的更上层。这就是为什么除了一些罕见的情况外,你永远不应该接触原生原型。即使如此,也不要在
    对象.prototype

    上设置非函数属性。你完全正确。几乎:
    事件和事件[event.type]?事件[event.type]:[]
    是它应该说的。你的替代符号可能会返回未定义的
    ,因为现在的情况是,我正在为她解决这个问题。接得好,埃利亚斯。谢谢你的评论。我想我让它更清晰了一点:)几乎:
    events&&events[event.type]?事件[event.type]:[]
    是它应该说的。你的替代符号可能会返回未定义的
    ,因为现在的情况是,我正在为她解决这个问题。接得好,埃利亚斯。谢谢你的评论。我想我把它弄清楚了一点:)真是个好例子!关于和疯子开的玩笑,我大笑不止:)举个例子吧!我曾经大声嘲笑过疯子的笑话:)),所以它基本上检查:1)jQuery。_数据(这个“事件”)存在2)它有event.type属性。对吗?谢谢!为什么不这样检查:
    jQuery.\u数据(这个“事件”)&&jQuery.\u数据(这个“事件”)[event.type]
    ?因为它们没有;)当然,您可以这样做,但在本例中,您可以重复
    jQuery.\u数据(这是“事件”)
    ,这可能是他们想要的