繁体   English   中英

三元至短路

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM