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