我正在尝试使用我的代码变得更简洁,而我从未真正理解的一件事就是Short-Circuit Eval。我认为这是因为当我研究这个问题时它没有点击,因为通常这些例子都是伪代码而我无法绕过它。
下面的代码是我写的一个AJAX脚本。什么是等效的短路表达式?如果可以的话,请用非专业人员的术语解释它是如何评估的。
var xhr; (XMLHttpRequest) ?
xhr = new XMLHttpRequest :
xhr = new ActiveXObject("Microsoft.XMLHTTP");
答案 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);