使用三元运算符或仅短路评估之间的区别?
Posted
技术标签:
【中文标题】使用三元运算符或仅短路评估之间的区别?【英文标题】:Difference between using a ternary operator or just short-circuit evaluation? 【发布时间】:2017-03-17 17:55:55 【问题描述】:最近遇到了短路评估,并对此感到有些困惑,因为我上周才开始编程。据我了解,如果在第一个双管之前发生的事情是真的,那么它将停止并且不评估在双管之后发生的事情。例如:
示例 1:
var a = true;
var b = a || ;
所以我假设如果 a 存在然后将 a 分配给 b 否则 b 等于一个对象。 我不明白我将在哪里使用它以及它与三元运算符有何不同,短路评估是否与以下内容相同:
示例 2:
var a = true;
var b = (a) ? a : ;
为什么要使用示例 1 而不是示例 2,因为它写出来的速度并不慢,或者使用其中一个比另一个有速度优势?或者这只是一个愚蠢的问题,也许我错过了一些东西。如果有人能为我解决这个问题,那就太好了。
【问题讨论】:
这只在第二个操作数有副作用时才重要。 使用任何你想要的。您已经花在思考上的时间将超过打字或执行方面的任何累积差异。 有点不相关,但作为一个实验尝试做b = a && ;
看看会发生什么,并尝试了解它为什么会发生。
【参考方案1】:
短路运算符可以通过多种方式影响正确性和性能。
关键是要避免第二个操作数的副作用或性能损失。
短路可以通过仅在安全时评估第二个操作数来避免错误:
var a = a && someFunctionThatWillThrowIfAIsNull(a);
如果更快的函数的结果可以使第二个操作数变得多余,则可以通过将其放在第二位来避免慢速函数:
var a = someFastFunction() || someSlowFunction();
【讨论】:
谢谢你,给了我比以前更多的洞察力。【参考方案2】:这是不同用法的示例(取决于第一个参数)。检查每个控制台以了解它们的工作方式。
console.log("'' || :", '' || );
console.log("1 || :", 1 || );
console.log("0 || :", 0 || );
console.log("true || :", true || );
console.log("false || :", false || );
console.log("[] || :", [] || );
console.log('');
console.log("('') ? '' : :", ('') ? '' : );
console.log("(1) ? 1 : :", (1) ? 1 : );
console.log("(0) ? 0 : :", (0) ? 0 : );
console.log("(true) ? true : :", (true) ? true : );
console.log("(false) ? false : :", (false) ? false : );
console.log("([]) ? [] : :", ([]) ? [] : );
console.log('');
console.log("'' && :", '' && );
console.log("1 && :", 1 && );
console.log("0 && :", 0 && );
console.log("true && :", true && );
console.log("false && :", false && );
console.log("[] && :", [] && );
【讨论】:
感谢您的视觉演示,我想我只是不太了解短路的工作原理,但我现在有了更好的想法,谢谢。 代码sn-p有错误。console.log("([]) ? '' : :", ([]) ? [] : );
应该是 console.log("([]) ? [] : :", ([]) ? [] : );
以上是关于使用三元运算符或仅短路评估之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章