![](/img/trans.png)
[英]Difference between using a ternary operator or just short-circuit evaluation?
[英]Ternary to Short-Circuit
我试图使自己的代码更加简洁,而我从未真正了解的事情之一就是短路评估。 我认为这是因为当我研究问题时,它不会单击,因为通常这些示例是伪代码,因此无法解决。
以下代码是我编写的AJAX脚本的摘要。 什么是等效的短路表达? 如果可以的话,请用外行的术语解释它是如何评估的。
var xhr; (XMLHttpRequest) ?
xhr = new XMLHttpRequest :
xhr = new ActiveXObject("Microsoft.XMLHTTP");
我认为您发布的示例不是说明短路的好方法。 我知道您说您已经看过其他示例,但是也许可以再做一个例子。
如果您使用三进制有这样的事情:
var fruit = apple ? apple : banana;
该代码的目的是“如果苹果是真实的,我希望水果等于苹果。否则,水果应该等于香蕉。”
使用短路的等效方法如下所示:
var fruit = apple || banana
由于布尔逻辑的工作方式,此代码执行相同的操作。 ||
运算符表示“或”。 您可能已经知道了。 但是,如果您考虑一下,只要||
一侧 运算符为true,整个语句为true。 因此,如果表达式中的第一项为true,则它甚至不必检查它的后半部分。 没有意义,无论哪种方式都是正确的,为什么不节省一些运行时间呢?
赋值之所以起作用,是因为它不是强制(苹果||香蕉)强制为布尔值,而是仅返回第一个真实值,并且无论何时在条件语句中使用它,都将被强制。
这是短路的更多示例
(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
函数将永远不会运行。 因为对于计算机而言,该表达式的后半部分可能也不存在。
短路允许您仅执行表达式的一部分(如果它匹配(或不匹配))。 在这种情况下,我们试图查看xhr是否有效,否则,我们将创建一个新的ActiveXObject。 如果它匹配(新的XMLHttpRequest),那么我们只需要执行该部分即可-将表达式短路。
您也可以说它
var xhr = (window.XMLHttpRequest && new XMLHttpRequest) || (new ActiveXObject);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.