在网上看到一些例子后,我收集了两个不同的解释:
Ex:var x = A || B;
- 如果A存在且B不存在,则返回左侧。
- 如果A存在且B存在,则返回右侧(最后评估值)。
醇>
基于该逻辑,我假设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();}
与短路?
答案 0 :(得分:6)
您的两个描述都不准确。
var x = A || B;
它的作用是:
null
,undefined
,0
,NaN
,{{1} },或空字符串,然后整个表达式的值是 V A ,评估停止。您的测试代码首先测试在第一个元素上调用“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”不是if
或null
。然而,在undefined
版本中,对变量“v”的“良好性”没有这样的明确测试;它只是直接使用。 (如果它恰好是||
,则会导致运行时错误。)
使用null
和||
的实际代码版本是可行的,但在我看来,现有代码更清晰。但是,仅出于讨论目的,您可以将&&
版本替换为:
if
就我个人而言,我觉得这看起来很丑陋。