三元到短路

时间:2015-04-08 20:25:34

标签: javascript jquery

我正在尝试使用我的代码变得更简洁,而我从未真正理解的一件事就是Short-Circuit Eval。我认为这是因为当我研究这个问题时它没有点击,因为通常这些例子都是伪代码而我无法绕过它。

下面的代码是我写的一个AJAX脚本。什么是等效的短路表达式?如果可以的话,请用非专业人员的术语解释它是如何评估的。

var xhr; (XMLHttpRequest) ? 
xhr = new XMLHttpRequest : 
xhr = new ActiveXObject("Microsoft.XMLHTTP");

2 个答案:

答案 0 :(得分:3)

我认为您发布的示例并不是说明短路的好方法。我知道你说你见过其他的例子,但也许还有一个例子可以解决。

如果你有这样的东西使用三元:

var fruit = apple ? apple : banana;

这段代码的意图是“如果苹果是真的,我希望水果等于苹果。否则,水果应该等于香蕉。”

使用短路的等效方法如下所示:

var fruit = apple || banana

由于布尔逻辑的工作方式,此代码执行相同的操作。 ||运算符表示OR。你可能已经知道了。但是如果你考虑一下,只要||运算符的一边是真的,整个陈述就是真的。因此,如果表达式中的第一项是真的,它甚至不会检查它的后半部分。没有意义,无论哪种方式都是如此,为什么不保存一些运行时?

并且赋值的作用是因为它不是将(apple ||香蕉)强制转换为布尔值,而是返回第一个真值,并且无论何时在条件语句中使用它都会被强制转换。

以下是一些短路的例子

(1 || 2) // 1
(0 || 5) // 5 (0 is falsey)
(false || 0) // If the first value is falsey, the expression evaluates to the second item, whether its truthy or falsey.
(5 || 0) // 5

编辑:

只是为了开车回家为什么叫做短路

function doWork(){
    console.log('Hello!');
}

(true || doWork())

控制台中不会打印任何内容,doWork函数永远不会运行。因为对于计算机,该表达式的后半部分可能也不存在。

答案 1 :(得分:1)

短路允许您只执行表达式的一部分(如果匹配(或不匹配))。在这种情况下,我们试图查看xhr是否有效,否则,我们将创建一个新的ActiveXObject。如果匹配(new XMLHttpRequest),那么我们只需执行该部分 - 短路表达式。

您也可以将其视为

var xhr = (window.XMLHttpRequest && new XMLHttpRequest) || (new ActiveXObject);