2017-04-27 123 views
1

找不到这个问题的更好的标题,所以编辑建议将不胜感激。分配变量条件与内联条件检查

我想知道是否有检查条件与分配的变量和内联条件之间的差异。
例如:

选项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是我的选择,因为它更具可读性,但我想知道行为或性能有差异吗? 有没有办法测试两种选择之间的性能?

+1

至于性能测试,如果你还没有听说过jsPerf的,这可能是最好的时刻访问该网站。有多种替代方案,它们都在浏览器中联机(例如http://jsben.ch/#/7XyeB)。 –

+0

@WiktorZychla有趣,谢谢我不知道这一点。虽然我有时会得到不同的结果。例如:代码块1最快,然后代码块2最快 –

回答

-1

至于检查性能,我会看看jsperf

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

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

在选项1中,如果第一个值为真,则第二个选项不会被评估为||是短路操作员,而在第二个选项中,将评估所有三个条件,而不管它们返回的结果如何。

如果性能是一个问题,因为这种方法被多次使用,我总是建议性能测试尽可能模拟真实世界的应用程序。

+0

*因为您在两个选项中进行相同的条件检查*这是不正确的。正如OP自己指出的那样,第一种情况将会短路,而第二种情况则不会。 – 2017-04-27 09:53:15

+0

@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; 
} 
+0

林不知道这是资格作为我的问题的确切答案,但这种解决方案是伟大的!没有想过它,有点让它“懒惰”的条件检查。非常感谢。 –