多个赋值var a = b = b || {}在JavaScript
读leaflet.js的代码,我碰到一个方法来与这条线,我不完全理解:多个赋值var a = b = b || {}在JavaScript
var events = this._leaflet_events = this._leaflet_events || {};
可以简化为
var a = b = b || {};
从我是这么理解这个指令是多用左手分配这是正确的关联,这意味着第一,JavaScript的运行
b = b || {} //if b exists, returns b, else return an empty object
,然后
a = b // returns the output of the preceding instruction
这对我没有意义。为什么不写反而:
a = b || {};
完全上下文:
addEventListener: function(/*string*/ type, /*function */ fn, /*(optional) object*/ context){
var events = this._leaflet_events = this._leaflet_events || {};
events[type] = events[type] || {};
events[type].push({
action: fn,
context: context || this
});
return this;
}
我怀疑参考伎俩,因为我不知道怎么this._leaflet_events
被通过该方法,否则修改。
思考,写作var a = b = b || {}
实际上是分配var a
一个参考b
一招,无论b
被定义或没有。修改a
现在修改b
。
返回传单。与
var events = this._leaflet_events = this._leaflet_events || {};
this._leaflet_events
要么存在或初始化为{}
。 events
被指定为this._leaflet_events
作为参考。引用的值可能是{}
,但仍然会在修改events
时修改this._leaflet_events
。
相反,写
var events = this._leaflet_events || {};
将是一个错误,因为如果没有定义this._leaflet_events
,events
现在将指向一个新创建的对象,其价值将是{}
。修改events
将更改新对象,但不会更改this._leaflet_events
的值。
相同的外观值,不同的参考。这是事情。
表达较短的将不设置任何为b的值
a = b = b || {}; //set b's b value to {} if b is uncdefined, then set a's value to b
a = b || {}; //set a's value to b, or {} if b is undefined
的第一条语句其实相当于
b = b || {};
a = b;
声明var a = b = b || {};
确实件事:
- 它初始化b键
{}
如果它是不确定的。 - 它将a设置为与b相同。
表达式a = b || {};
不会修改b,因此它不等价。
你没有发现两个变量名的不同 - 请参阅我的答案。 – ThiefMaster
@ThiefMaster:我认为这只是一个错误的问题。检查原始源代码:https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –
仅供参考,'this._leaflet_events'比'this._leaflet不同。 events'。 –
我的错误,我编辑了帖子 – cedricbellet