JavaScript短路逻辑

3

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

例如:var x = A || B;

  1. 如果A存在而B不存在,则返回左边。
  2. 如果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();

编辑于2013年10月10日下午1:02

我没有提到我的真实意图,但基于答案和讨论,我的目标本质上是将以下代码转换为我最初提到的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();}和短路的区别?

我不确定你所说的“存在”和“不存在”的含义,但使用||进行短路求值检查值的真实性。因此,它正在检查调用.click()的结果的真实性。 - Ian
如果A是某个东西,那么B是或不是都无所谓... - dandavis
请明确陈述您的问题,发布相关的HTML和JavaScript代码,并包含一个可演示的工作fiddle。 - Reinstate Monica -- notmaynard
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
你的两个描述都不准确。
var x = A || B;
这段代码的作用是:
  1. 评估“A”。将结果称为 VA
  2. 如果 VA 不是 nullundefined0NaNfalse 或空字符串,则整个表达式的值为 VA,并停止评估。
  3. 评估“B”。将结果称为 VB该值 VB 是表达式的值。
你的测试代码首先测试调用第一个元素的“click”函数的返回值,然后测试第二个元素。这两个函数都返回undefined,因此在||两侧的子表达式都会被评估。也就是说,第一次调用得到了VA,它是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();
请注意,在if语句版本中,它明确检查“v”。这样的测试将在“v”的值上执行“真/假”测试。在这种情况下,它实际上是在确保“v”既不是null也不是undefined。然而,在||版本中,并没有对变量“v”的“好坏”进行明确的测试;它只是直接使用。(如果它在那里碰巧是null,那么就会导致运行时错误。) 实际代码的一个版本使用||&&是可能的,但我认为现有的代码更清晰。但是,仅供讨论目的,你可以用以下代码替换if版本:
v && (v.item(0).click(), true) || i && i.item(0).click();

个人认为这看起来有点丑。


按照这个逻辑,如果整个表达式求值为“undefined”,为什么A和B都会触发呢?难道不应该抛出一个标志/警告而不执行吗? - brooklynsweb
1
@brooklynsweb 不,JavaScript 就不是这样工作的。两个都会触发,因为在评估“A”并确定它是“falsy”之后,它必须评估“B”;这就是 || 运算符的全部意义所在。 - Pointy
这可能有点离题,但是相关的——'falsy'和'false'之间有什么区别?如果'falsy'像'false'一样,那么它不应该触发A并停止(根据您的第2项描述——它是一个'false(y)'值)吗?如果问题听起来很幼稚,请原谅;我对您对我的一般问题的回答有了大致的理解。例如,这是我的另一个代码版本[链接]http://jsfiddle.net/nysteve/QHumL/60/。表达式“if(v)”不是意味着“如果v存在,则为真”吗?我想我试图使用SC来压缩这个版本。 - brooklynsweb
我明白了,@Pointy,请再仔细看一下我的原始问题,因为我已经添加了我的主要意图。 - brooklynsweb
1
啊,好的,谢谢 - 这帮助我看到你想做什么。我会在答案中添加。 - Pointy
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,