三元运算符可以等效于与逻辑运算符的短路吗?

Posted

技术标签:

【中文标题】三元运算符可以等效于与逻辑运算符的短路吗?【英文标题】:Can the ternary operator be equivalent to short circuiting with the logical operators? 【发布时间】:2016-05-11 22:45:54 【问题描述】:

通过短路,您可以防止对表达式的一部分进行评估:

let x = "", y = 123;
x && alert("foo"); // ""
y || alert("bar") // 123

由于逻辑运算构成表达式,您可以在函数调用或返回语句中使用它们。

但归根结底,这不过是条件分支,可以通过三元运算符轻松实现:

x ? alert("foo") : x; // ""
y ? y : alert("bar"); // 123

这更具可读性并且同样简洁。除了说明性术语之外,是否有理由利用逻辑运算符的短路特性?

【问题讨论】:

&&|| 被设计为 &| 的特殊形式,针对特定情况进行了优化。对于习惯于用布尔运算来思考的人来说,x ? y : xx && y 的可读性要差得多,还有副作用问题,而且它们与 javascript 继承它们的 C 语言不太一样。 【参考方案1】:

这是真的(嗯,几乎是真的)

x ? x : y

逻辑上等价于

x || y

但是,就代码运行时发生的情况而言,它们并不等同。在? : 的情况下,子表达式x 可能会被计算两次。在x || y 中,它肯定只评估了一次。对于简单的变量引用,这无关紧要,但如果x 是一个函数调用,它可能会影响行为并且肯定会影响性能。

(其中一个表达式可能会被计算两次,这就是我在第一句话中所说的“几乎”的意思。)

【讨论】:

就是这样!我知道我忽略了一些东西。谢谢! 我很想知道逻辑等价中“几乎正确”的部分是什么。是否存在其中一个表达式为真而另一个不为真的情况? 对于诸如“options || ”之类的东西,使用惯用的“||”更具可读性而不是使用三元运算符。 为什么引擎不能优化这个?因为函数内可能存在场地效应? 是的,但要回答“为什么引擎不能?”我们必须从“谁说不能?”开始。如果有些人在操作数是单个变量时这样做,或者有些人在操作数是文字时这样做,我不会感到惊讶。如果两者都没有,我也不会感到惊讶,因为它不会大受欢迎。

以上是关于三元运算符可以等效于与逻辑运算符的短路吗?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 等效于三元运算符 [重复]

三元运算符是不是以定义的方式短路

JavaScript 三元运算符可以支持 3 个条件吗?

逻辑运算符三元运算符for循环stack(栈),heap(堆),方法区,静态域

Python等效于省略三元运算符的第二部分(a if a else b)

短路代替三元运算符