【问题标题】:Difference between "if (foo) bar();" and "foo && bar();" [duplicate]“if (foo) bar();”之间的区别和“foo && bar();” [复制]
【发布时间】:2013-07-28 12:01:27
【问题描述】:

以下两个 sn-ps 之间有什么区别,或者有什么理由使用一个而不是另一个?

if (foo) {
    bar();
}

 

foo && bar();

【问题讨论】:

  • 第一种比较传统。但实际上,它们是相同的。
  • 没有区别,但我更喜欢一行 if 语句。 if (foo) bar();

标签: javascript


【解决方案1】:

第二种形式称为short-circuit evaluation,其结果与第一种形式完全相同。然而,第一种形式更具可读性,应该优先考虑可维护性。

这种类型的短电路求值经常出现在 if 语句中,其中右手是有条件地求值的。请参见下面的示例; bar 仅在 foo 评估为 true 时评估。

if (foo && bar()) {
    // ...
}

【讨论】:

  • 在语法意义上不完全一样。 (表达式 vs 语句)
【解决方案2】:

版本foo && bar()是一个表达式,因此有一个值:

var result = foo && bar();

使用if 版本时,上图可能如下所示:

var result;
if (foo) {
    result = bar();
}

这更冗长。

【讨论】:

  • 其实foo && bar();是语句,不是表达式,foo && bar()是表达式。
  • @zch 正确。这是一个expression statement
  • if-version 不正确;如果 foo 是假的,则返回该假值。因此else { result = foo; }.
【解决方案3】:

bouke 用短路评估的答案真的很好。但我想补充一点,一个好的编码风格是使用 if 语句,如果 bar() 的调用没有 boolean-return-value 并且不需要使用 bar() 满足进一步的条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多