JavaScript短路逻辑

时间:2013-10-10 16:00:56

标签: javascript short-circuiting

在网上看到一些例子后,我收集了两个不同的解释:

  
    

Ex:var x = A || B;

         
        
  1. 如果A存在且B不存在,则返回左侧。
  2.     
  3. 如果A存在且B存在,则返回右侧(最后评估值)。
  4.        

基于该逻辑,我假设x将返回:v.item(0).click()。但是当测试它时,x先返回B然后返回A,又称解雇B然后再打开A.为什么? (http://jsfiddle.net/nysteve/QHumL/59/

HTML:

<div class="indeed-apply-button" onclick="alert('BOOM BUTTON');">boo</div>
<div class='view_job_link' onclick="alert('BOOM LINK');">boo</div>

的JavaScript

var v = document.getElementsByClassName('view_job_link');
var i = document.getElementsByClassName('indeed-apply-button');
var x = v.item(0).click() || i.item(0).click();

编辑1:02 PM 10/10/2013

没有提到我的真实意图,但根据答案和讨论,我的目标主要是将以下代码转换为我最初提到的JavaScript代码。

var v = document.getElementsByClassName('view_job_link');
var i = document.getElementsByClassName('indeed-apply-button');
if(v){v.item(0).click();}
else if(i){i.item(0).click();}
else{}

在上面的代码中,您如何阅读if(v){v.item(0).click();}与短路?

1 个答案:

答案 0 :(得分:6)

您的两个描述都不准确。

var x = A || B;

它的作用是:

  1. 评估“A”。 调用结果V A
  2. 如果 V A 不是nullundefined0NaN,{{1} },或空字符串,然后整个表达式的值是 V A ,评估停止。
  3. 评估“B”。 调用结果V B 该值 V B ,是表达式的值。
  4. 您的测试代码首先测试在第一个元素上调用“click”函数的返回值,然后测试第二个元素的返回值。这些函数都返回false,因此评估undefined两侧的子表达式。也就是说,第一个调用得到 V A 并且它是||,这意味着另一方也将被评估,并且这将是值的表达。 (它会出来undefined。)

    编辑 - 现在你已经在答案中添加了更多内容,我想我知道你在做什么。

    在您的实际代码中(或者,我猜,更接近现实的示例代码),您已经拥有:

    undefined

    这意味着完全不同于:

    if(v){v.item(0).click();}
    else if(i){i.item(0).click();}
    else{}
    

    请注意,在var x = v.item(0).click() || i.item(0).click(); 语句版本中,它显式检查“v”。像这样的测试将对“v”的值执行“truthy / falsy”测试。在这种情况下,它确实检查以确保“v”不是ifnull。然而,在undefined版本中,对变量“v”的“良好性”没有这样的明确测试;它只是直接使用。 (如果它恰好是||,则会导致运行时错误。)

    使用null||的实际代码版本是可行的,但在我看来,现有代码更清晰。但是,仅出于讨论目的,您可以将&&版本替换为:

    if

    就我个人而言,我觉得这看起来很丑陋。