JavaScript中的变量赋值解释(OR ||)

410

鉴于这段JavaScript代码片段...

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

有人可以解释一下这个技术叫什么吗?(我最好的猜测是在这个问题的标题中!)? 它是如何/为什么正好起作用的?

我的理解是变量f将被赋予第一个具有值不为null或undefined的变量(从左到右),但我没有找到太多关于这种技术的参考资料,而且我看到它被广泛使用。

此外,这种技术是否特定于JavaScript? 我知道在PHP中做类似的事情会导致f具有真正的布尔值,而不是d本身的值。


4
关于PHP的旧问题,有一个你可以使用的构造:$f=$a or $f=$b or $f=$c; // 等等。PHP有||运算符和or运算符,它们执行相同的工作;然而or在赋值之后被计算,而||在之前被计算。这也使你可以使用Perl风格的$a=getSomething() or die('oops'); - Manngo
1
在 PHP 5.3 中,您可以省略三元运算符的中间部分,因此基于此... 您还可以将其缩短为以下内容: $f = $a ?: $b ?: $c; - Rei
1
从PHP 7开始,您可以使用??来实现此目的。 $a = $b ?? 'default' - Spencer Ruskin
@SpencerRuskin,所以如果$b为真,则$a将被赋值为$b的值,否则为'default' - oldboy
没错。请查看此页面上的空值合并运算符部分:https://www.php.net/manual/en/migration70.new-features.php - Spencer Ruskin
12个回答

1

它将评估X,如果X不是null、空字符串或0(逻辑假),则将其分配给z。如果X为null、空字符串或0(逻辑假),则将y分配给z。

var x = '';
var y = 'bob';
var z = x || y;
alert(z);

将输出'bob';


1
你应该澄清你所说的“空”。空字符串强制转换为false,但是空数组或对象强制转换为true - Daniel Cassidy
@Daniel "null, empty, or 0" -- 在数组和对象中,null适用。但我理解你的意思了。 - tvanfosson

1
根据Bill Higgins的博客文章the Javascript logical OR assignment idiom(2007年2月),此行为至少在v1.2中是正确的。
他还提出了另一种用途(引用):“轻量级规范化跨浏览器差异”。
// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接