阅读leaflet.js的代码,我遇到了一个我不太了解的方法:
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
。引用的值可能为{}
,但在修改this._leaflet_events
时仍会修改events
。
相反,写作
var events = this._leaflet_events || {};
将是一个错误,因为如果未定义this._leaflet_events
,events
现在将指向一个新创建的对象,其值为{}
。修改events
会更改新对象,但不会更改this._leaflet_events
的值。
相同的值,不同的引用。事情就是这样。
答案 0 :(得分:10)
声明var a = b = b || {};
执行两个事情:
{}
。表达式a = b || {};
不会修改b,因此它不等同。
答案 1 :(得分:7)
较短的表达式不会将任何内容设置为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;