3

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

例如: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();}与短路?

4

1 回答 1

6

你的两个描述都不准确。

var x = A || B;

这样做是:

  1. 评估“A”。称结果为 V A
  2. 如果V A不是null, undefined, 0, NaN,false或空字符串,则整个表达式的值为V A并且计算停止。
  3. 评估“B”。称结果为 V B该值V B是表达式的值。

您的测试代码首先测试在第一个元素和第二个元素上调用“click”函数的返回值。这些函数都返回undefined,所以两边的子表达式都会||被计算。也就是说,第一个调用得到V A和 it's 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" 不是nullor undefined。然而,在这个||版本中,变量“v”的“好”没有这样的明确测试;它只是直接使用。(如果它碰巧在null那里,那会导致运行时错误。)

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

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

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

于 2013-10-10T16:06:05.157 回答