JavaScript中的逻辑运算符||
和&&
使用短路求值。但是与其他语言不同的是,它返回导致执行停止的最后一个值的结果,而不是true
或false
值。
以下值在JavaScript中被视为假值:
- false
- null
""
(空字符串)
- 0
- Nan
- undefined
忽略运算符优先级规则,简单起见,以下示例展示了哪个值导致了求值的停止,并作为结果返回。
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
前五个值中的NaN
是假值,所以它们从左到右进行求值,直到遇到第一个真值——"Hello"
,使整个表达式为真,因此任何进一步的内容都不会被求值,并且"Hello"
作为表达式的结果返回。类似地,在这种情况下:
1 && [] && {} && true && "World" && null && 2010 // null
前五个值都是“真值”并且会被求职,直到遇到第一个“假值”(
null
)导致表达式返回false,所以
2010
不再计算,
null
作为表达式的结果返回。
你提供的示例利用了JavaScript的这个特性来执行赋值操作。它可以在任何需要从一组值中获取第一个“真值”或“假值”的地方使用。下面的代码将把值
"Hello"
分配给
b
,这使得默认值更容易分配,而无需进行if-else检查。
var a = false;
var b = a || "Hello";
你可以将下面的示例称为对该特性的利用,我认为这会使代码更难以阅读。
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
在这个警报框中,我们首先检查messages
是否为假值。如果是,我们将评估并返回noNewMessagesText
;否则,我们将评估并返回newMessagesText
。由于在此示例中它是假值,因此我们会停止在noNewMessagesText处,并弹出"对不起,您没有新消息。"
。
$f=$a or $f=$b or $f=$c; // 等等
。PHP有||
运算符和or
运算符,它们执行相同的工作;然而or
在赋值之后被计算,而||
在之前被计算。这也使你可以使用Perl风格的$a=getSomething() or die('oops');
。 - Manngo$f = $a ?: $b ?: $c;
- Rei??
来实现此目的。$a = $b ?? 'default'
- Spencer Ruskin$b
为真,则$a
将被赋值为$b
的值,否则为'default'
? - oldboy