多个赋值var a = b = b || javascript中的{}

时间:2012-05-28 22:05:19

标签: javascript variable-assignment

阅读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_eventsevents现在将指向一个新创建的对象,其值为{}。修改events会更改新对象,但不会更改this._leaflet_events的值。

相同的值,不同的引用。事情就是这样。

2 个答案:

答案 0 :(得分:10)

声明var a = b = b || {};执行两个事情:

  • 如果未定义,则将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;