【问题标题】:Conditions with assigned variables vs inline condition check分配变量的条件与内联条件检查
【发布时间】:2017-09-24 19:33:51
【问题描述】:

找不到更好的标题,因此非常感谢编辑建议。

我想知道使用分配变量检查条件和内联条件之间是否有区别。
例如:

选项 1:

// inline conditions check
function isSomething(){
    return (1 > 2 || 'a' == 'a' || 2 < 4) || 
           (55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2) || 
           ('abc' != 'bca' && 3 == 3);
}

选项 2:

// pre assigned variables condition check
function isSomething(){
    const conditionA = 1 > 2 || 'a' == 'a' || 2 < 4; // some complex condition
    const conditionB = 55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2; // some complex condition
    const conditionC = 'abc' != 'bca' && 3 == 3 // some complex condition

    const result = conditionA || conditionB || conditionC;
    return result;
}

似乎在选项 2 中它必须检查所有 3 个条件,但在选项 1 中理论上它可以在第一次检查它是否为 true 后返回。

显然选项 2 是我的选择,因为它更具可读性,但我想知道在行为或性能方面是否存在差异? 有没有办法测试这两个选项之间的性能?

【问题讨论】:

  • 至于性能测试,如果您还没有听说过 jsPerf,这可能是访问该站点的最佳时机。它有多种替代方案,所有这些都在您的浏览器中在线(例如jsben.ch/#/7XyeB)。
  • @WiktorZychla 很有趣,谢谢我不知道。虽然我有时会得到不同的结果。例如:代码块 1 最快然后代码块 2 最快

标签: javascript variables conditional-statements variable-assignment


【解决方案1】:

就检查性能而言,我会查看jsperf

如果您还没有,请查看console.time()console.profile()performance.now()

在选项 2 中,您将创建 3 个新对象并将它们分配给变量,创建对象并将它们分配到内存中,这对性能的影响往往是微不足道的。

在选项 1 中,如果第一个值为 true,则不会评估第二个选项,因为 || 是短路运算符,而在第二个选项中,将评估所有三个条件,无论它们返回的结果如何。

如果由于多次使用此方法而导致性能成为问题,我始终建议性能测试尽可能模拟真实世界的应用程序。

【讨论】:

  • 因为您在两个选项中执行相同的条件检查这是不正确的。正如OP自己指出的那样,第一种情况会短路,而第二种情况不会。
  • @torazaburo 我在第一种情况下看到,如果第一个条件为真,其他条件将不会运行,而在第二种情况下它们会运行。我会改变答案。
【解决方案2】:

如果您想将短路评估的好处与可读性和命名变量结合起来,那么

function isSomething(){
  const conditionA = () => 1 > 2 || 'a' == 'a' || 2 < 4;
  const conditionB = () => 55 == 1 || (32 > 4 || 'a' == 'a') && 6 > 2;
  const conditionC = () => 'abc' != 'bca' && 3 == 3;

  const result = conditionA() || conditionB() || conditionC();

  return result;
}

【讨论】:

  • 我不确定这是否符合我的问题的确切答案,但这个解决方案很棒!没有考虑过,有点让它“懒惰”的条件检查。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多