使用 && 进行单线短路评估 ||在 JavaScript 中

Posted

技术标签:

【中文标题】使用 && 进行单线短路评估 ||在 JavaScript 中【英文标题】:One-line short-circuit evaluation with && || in JavaScript 【发布时间】:2015-08-27 13:00:03 【问题描述】:
var prefix = options && options.prefix || '';

在我的情况下,在 JavaScipt 中。有人能解释一下这是什么陈述或条件吗?或者最后 prefix 变量的值是多少?

我知道(三元运算符):

condition ? expr1 : expr2

但这不一样。

【问题讨论】:

你不明白怎么办? &&AND||ORoptions 是什么? 【参考方案1】:

这一行就相当于说:

var prefix;
if(options && options.prefix)
  prefix = options.prefix;
 else
  prefix = '';

【讨论】:

他们把这种技术叫做什么?我知道单行条件,例如: a==b?'1':'2';但是第一次看到这么短。 @PooyaSanooei - 您评论中的示例是ternary operator。 @PooyaSanooei 它们是不同的,当options.prefixnullundefined 时,这两个语句返回不同的值。 三元运算符与此相比有些不同。这里 ||像这样工作: 它叫做Short-circuit Evaluation。 javascript 的 ||运算符将返回第一个非假值,而不是标准化布尔值。这是shorten technique used in javascript。【参考方案2】:

该语句将变量“prefix”设置为“options.prefix”的值或空字符串,这样如果“options”不存在,它不会抛出错误。

【讨论】:

【参考方案3】:

这意味着,options 是一个对象,使用options.prefix。如果options.prefixundefinednull 或其他假值,则返回空字符串。

几乎options ? options.prefix : ''含义相同。

【讨论】:

【参考方案4】:

这工作的原因是在 Javascript 逻辑运算符中计算最后一个操作数的值。

如果存在选项对象,则表达式的 && 部分将被评估为 options.prefix。

如果没有设置,|| 的左边部分表达式将为假,右侧部分 = '' 字符串 - 将被返回。

【讨论】:

【参考方案5】:

类似如下:

var prefix;
if(options)     // or for better understanding, its if(options != undefined)
    prefix = options.prefix;

else
    prefix = '';

尝试以下小提琴以更好地理解: http://jsfiddle.net/n41tfnh4/1/

【讨论】:

这实际上比接受的答案更正确,因为如果options.prefix 被替换为函数调用,接受的答案会调用它两次,这是不正确的。这个版本只会调用一次,这是正确的行为【参考方案6】:

翻译成人类语言

如果变量options定义了一些非假值

它还有一个属性options.prefix,其值也是非假的

然后用这个options.prefix 值设置变量prefix

否则,我们的prefix默认设置为空字符串。


PS.通过google“javascript falsy values”快速查看JavaScript中falsey values的完整列表


更快的解释

这是options.prefix 的快速值检查(和获取),默认情况下为空字符串。

options 未定义时不抛出异常)

【讨论】:

这个技术和ternary operators不一样?看起来我们使用 ||而不是: 为了得到等价的结果,你也可以使用三元运算符var prefix = options ? (options.prefix || '') : ''【参考方案7】:

如果prefixoptions 上可用,请将其设置为var prefix。否则,将其设置为空字符串。

【讨论】:

以上是关于使用 && 进行单线短路评估 ||在 JavaScript 中的主要内容,如果未能解决你的问题,请参考以下文章

我将如何修改运算符“&&”和“||”的定义让他们不使用短路评估?

在 C 中使用 ++ 运算符对语句进行短路评估

如何避免短路评估

c中的内部短路评估

C++如何处理&&? (短路评估)[重复]

有没有办法在 Java 中禁用短路评估?