我正在调试一些JavaScript,无法解释这个||做什么:

function (title, msg) {
  var title = title || 'Error';
  var msg   = msg || 'Error on Request';
}

为什么这个家伙使用var title = title || 'ERROR'?我有时也看到它没有var声明。


当前回答

双管操作员

这个例子可能有用:

var section = document.getElementById('special');
if(!section){
     section = document.getElementById('main');
}

它也可以是:

var section = document.getElementById('special') || document.getElementById('main');

其他回答

基本上,它检查||之前的值是否为true。如果是,则取该值,如果不是,则取||之后的值。

它将取||之后的值(据我所知):

未定义的 假 0 (Null或空字符串)

为了对我前面所说的一切进行解释,我应该给你们一些例子来理解逻辑概念。

var name = false || "Mohsen"; # name equals to Mohsen
var family = true || "Alizadeh" # family equals to true

这意味着如果左边的语句被赋值为true,那么它将被结束,左边的语句将被返回并赋值给变量。在其他情况下,右侧将返回并分配。

和运算符有相反的结构,如下所示。

var name = false && "Mohsen" # name equals to false
var family = true && "Alizadeh" # family equals to Alizadeh

我还要补充一点:这种简写令人厌恶。它误用了一个意外的解释器优化(如果第一个操作为真,就不麻烦第二个操作)来控制赋值。这种用法与操作符的目的无关。我不认为它应该被使用。

我更喜欢用三元运算符来初始化,例如,

var title = title?title:'Error';

这使用一行条件操作来达到正确的目的。它仍然与真实玩难看的游戏,但这是JavaScript为你。

再解释一下……

||操作符是逻辑或操作符。如果第一部分为真,则结果为真;如果第二部分为真,则结果为真;如果两部分都为真,则结果为真。为了清晰起见,这里是一个表格:

 X | Y | X || Y 
---+---+--------
 F | F |   F    
---+---+--------
 F | T |   T    
---+---+--------
 T | F |   T    
---+---+--------
 T | T |   T    
---+---+--------

Now notice something here? If X is true, the result is always true. So if we know that X is true we don't have to check Y at all. Many languages thus implement "short circuit" evaluators for logical-or (and logical-and coming from the other direction). They check the first element and if that's true they don't bother checking the second at all. The result (in logical terms) is the same, but in terms of execution there's potentially a huge difference if the second element is expensive to calculate.

那么这和你的例子有什么关系呢?

var title   = title || 'Error';

Let's look at that. The title element is passed in to your function. In JavaScript if you don't pass in a parameter, it defaults to a null value. Also in JavaScript if your variable is a null value it is considered to be false by the logical operators. So if this function is called with a title given, it is a non-false value and thus assigned to the local variable. If, however, it is not given a value, it is a null value and thus false. The logical-or operator then evaluates the second expression and returns 'Error' instead. So now the local variable is given the value 'Error'.

这是因为在JavaScript中实现了逻辑表达式。它不会返回一个合适的布尔值(真或假),而是返回它在一些规则下给出的值,这些规则被认为是等价于真,什么被认为是等价于假。查看JavaScript参考,了解JavaScript在布尔上下文中认为什么是真或假。

双管操作员

这个例子可能有用:

var section = document.getElementById('special');
if(!section){
     section = document.getElementById('main');
}

它也可以是:

var section = document.getElementById('special') || document.getElementById('main');