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

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

我知道(三元运算符):

condition ? expr1 : expr2

但这不一样。

【问题讨论】:

  • 你不明白怎么办? &&AND||ORoptions 是什么?

标签: javascript conditional-operator short-circuiting


【解决方案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。否则,将其设置为空字符串。

        【讨论】:

          猜你喜欢
          • 2013-02-28
          • 1970-01-01
          • 2016-08-21
          • 2015-05-11
          • 2012-02-03
          • 2021-09-23
          相关资源
          最近更新 更多