为什么JS库中的常见做法是复制变量名称并添加"或对象"

Elm*_*mov 3 javascript oop

我试图更好地掌握JS语法,我想知道为什么在已经声明了具有相同名称的变量之后重复对象名称的许多库中的常见做法.请看下面:

var Backbone = Backbone || {};    // <= Why the duplication?
Run Code Online (Sandbox Code Playgroud)

要么

var listeners = this._listeners || (this._listeners = {});
Run Code Online (Sandbox Code Playgroud)

更新:

经过进一步的研究,我发现了一篇非常好的文章来评估许多惯用语表达.

本文还解释了立即调用函数表达式(IIFE)背后的用法,即在函数中包装函数,如:

(function() {
  console.log('Hello!');
})();
Run Code Online (Sandbox Code Playgroud)

这是另一个像我这样的新手无法理解的JS脑筋急转弯者.

far*_*jad 9

var Backbone = Backbone || {};
Run Code Online (Sandbox Code Playgroud)

表示是否Backboneundefinednullfalse,设置为{}


更长的解释:

赋值运算符的计算逻辑运算符(即使JavaScript并没有真正的逻辑运算符,因为他们对工作的非布尔操作数为好)评估从左边右边.

像表达式A || B返回B如果Aundefined,null,或false.

所以A = A || B要么保留A价值,如果它已经有一个或分配BA.