【问题标题】:JavaScript Short Circuit LogicJavaScript 短路逻辑
【发布时间】:2013-10-18 12:12:30
【问题描述】:

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

例如:var x = A ||乙;

  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()的结果的真实性
  • 如果 A 是某种东西,那么 B 是什么或不是什么都无关紧要......
  • +1 用于清楚地说明您的问题,发布您的相关 html 和 JavaScript 代码,并包括一个工作小提琴来演示。

标签: javascript short-circuiting


【解决方案1】:

你的两个描述都不准确。

var x = A || B;

它的作用是:

  1. 评估“A”。 调用结果VA。
  2. 如果 VA 不是 null、undefined、0、NaN、false 或空字符串,则值为整个表达式的值是 VA 并且评估停止。
  3. 评估“B”。 调用结果VB。那个值,VB,就是表达式的值。

您的测试代码首先测试在第一个元素上调用“click”函数的返回值,然后是第二个元素。这些函数都返回undefined,因此|| 两侧的子表达式都会被计算。也就是说,第一个调用得到 VA 并且它是undefined,这意味着另一方也将被评估,这将是表达。 (它会出来undefined。)

edit — 好的,既然你已经在答案中添加了更多内容,我想我明白你在做什么了。

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

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,那会导致运行时错误。)

使用|| 和&amp;&amp; 的实际代码版本是可能的,但我认为现有代码更清晰。但是,出于讨论目的,您可以将 if 版本替换为:

v && (v.item(0).click(), true) || i && i.item(0).click();

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

【讨论】:

  • 按照这个逻辑,如果整个表达式的计算结果为“未定义”,为什么 A 和 B 都会触发。这不应该抛出一个标志/警告并且根本不执行吗?
  • @brooklynsweb 不,这不是 JavaScript 的工作方式。它们都触发了,因为在评估“A”并确定它是“虚假”之后,它必须评估“B”;这就是|| 运算符的全部意义所在。
  • 这可能有点跑题了——但相关——“falsy”和“false”有什么区别?如果 'falsy' 就像 'false',那么它不应该触发 A 并停止(根据您的第 2 项描述——它是一个类似于 'false(y)' 的值)吗?如果这个问题听起来很幼稚,请原谅;不过,我明白了你对我的一般问题的回答的要点。例如,这是我的代码的另一个版本 [link]jsfiddle.net/nysteve/QHumL/60。表达式“if(v)”不意味着“如果 v 存在是真的吗?”我想我是在尝试使用 SC 来压缩这个版本。
  • 为什么我以前不能使用 [@ + Pointy] (现在可以使用:@Pointy)来称呼你 Pointy?是因为你是唯一一个制作 cmets 的人吗?
  • 啊,好的,谢谢 - 这有助于我了解您想要做什么。我会补充答案。
猜你喜欢
  • 2015-04-11
  • 2012-01-01
  • 1970-01-01
  • 2015-03-04
  • 2012-02-04
  • 2020-05-11
相关资源
最近更新 更多