给出这段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本身的值。


当前回答

Javascript变量没有类型,所以f可以被赋值为整数值,即使它是通过布尔运算符赋值的。

F被赋给不等于false的最接近的值。0, false, null, undefined,都被传递:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'

其他回答

它叫做短路操作员。

短路求值表示,只有当第一个参数不足以确定表达式的值时,才执行或求值第二个参数。当OR(||)函数的第一个参数为true时,整体值必须为true。

它也可以用来设置函数参数的默认值。

function theSameOldFoo(name){ 
  name = name || 'Bar' ;
  console.log("My best friend's name is " + name);
}
theSameOldFoo();  // My best friend's name is Bar
theSameOldFoo('Bhaskar');  // My best friend's name is Bhaskar`

它将新变量(z)设置为x的值(如果它是“真值”(非零,有效的对象/数组/函数/无论它是什么)或y。这是在x不存在的情况下提供默认值的一种相对常见的方式。

例如,如果你有一个接受可选回调参数的函数,你可以提供一个默认的不做任何事情的回调:

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}

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

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

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

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

返回输出的第一个真值。

如果全部为假,则返回最后一个假值。

例子:-

  null || undefined || false || 0 || 'apple'  // Return apple