给出这段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或未定义值的变量的最近值(从左到右),但我没有设法找到关于这种技术的很多参考资料,并且已经看到它被大量使用。

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


当前回答

根据Bill Higgins的博客文章;Javascript逻辑或赋值习惯(2007年2月),这个行为在v1.2(至少)是正确的。

他还提出了另一种用法(引用): “跨浏览器差异的轻量级规范化”

// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;

其他回答

这是为了分配一个默认值,在这种情况下,y的值,如果x变量是假的。

JavaScript中的布尔运算符可以返回一个操作数,而不总是像其他语言中那样返回布尔结果。

逻辑或运算符(||)返回它的第二个操作数的值,如果第一个操作数是假的,否则返回第一个操作数的值。

例如:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Falsy值是那些在布尔上下文中使用时强制为false的值,它们是0、null、undefined、空字符串、NaN,当然还有false。

说明请参见短路评估。这是实现这些运算符的常用方式;它并不是JavaScript独有的。

它将计算X,如果X不为空字符串或0(逻辑错误),那么它将把它赋值给z。如果X为空字符串或0(逻辑错误),那么它将把y赋值给z。

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

将输出'bob';

这意味着如果设置了x,则z的值将为x,否则如果设置了y,则其值将设置为z的值。

这和

if(x)
  z = x;
else
  z = y;

这是可能的,因为JavaScript中的逻辑运算符并不返回布尔值,而是返回完成操作所需的最后一个元素的值(在OR句中,它将是第一个非假值,在AND句中,它将是最后一个)。如果操作失败,则返回false。

根据Bill Higgins的博客文章;Javascript逻辑或赋值习惯(2007年2月),这个行为在v1.2(至少)是正确的。

他还提出了另一种用法(引用): “跨浏览器差异的轻量级规范化”

// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;