我正在调试一些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');

其他回答

" x = x || y是什么意思"

分配默认值。

这意味着提供一个y到x的默认值, 如果x还在等待它的值,但还没有收到它,或者为了回到默认值而故意忽略它。

||为布尔或运算符。在JavaScript中,undefined, null, 0, false被认为是假值。

它只是意味着

true || true = true
false || true = true
true || false = true
false || false = false

undefined || "value" = "value"
"value" || undefined = "value"
null || "value" = "value"
"value" || null = "value"
0 || "value" = "value"
"value" || 0 = "value"
false || "value" = "value"
"value" || false = "value"

双管操作员

这个例子可能有用:

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

它也可以是:

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

这意味着title参数是可选的。因此,如果你不带参数调用该方法,它将使用默认值“Error”。

它是写作的简写:

if (!title) {
  title = "Error";
}

这种使用布尔表达式的简写技巧在Perl中也很常见。用这样的表达式:

a OR b

如果a或b为真,它的值为真。所以如果a为真,你根本不需要检查b。这被称为短路布尔计算,因此:

var title = title || "Error";

基本上检查title的结果是否为false。如果是,则返回"Error",否则返回title。

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

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

var title = title?title:'Error';

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