三元运算符和逻辑运算符的短路计算是否等价?

6

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

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

由于逻辑操作符形成表达式,您可以在函数调用或返回语句中使用它们。

但最终,这只是条件分支,可以很容易地使用三元运算符实现:

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

这种写法更易读并且同样简明。除了使用逻辑运算符的短路性质用于说明术语外,还有其他原因吗?


&&||被设计为&|的特殊形式,针对特定情况进行了优化。对于习惯于布尔运算思维的人来说,使用x ? y : x代替x && y会更难以阅读,还存在副作用问题,并且它们与Javascript继承自C语言的方式并不完全相同。 - Jon Hanna
1个回答

8

实际上(准确来说,差不多是这样),

x ? x : y

逻辑上等价于

x || y

然而,在代码运行时,它们在结果上并不等效。在 ? : 的情况下,子表达式 x 可能会被评估 两次。 在 x || y 中,则肯定只评估一次。对于简单的变量引用,这没有关系,但如果 x 是一个函数调用,它可能会影响其行为,并且肯定会影响性能。(我在第一句话中所说的 "几乎" 就是指其中一个表达式可能会被评估两次的情况。)

对于像 "options || {}" 这样的东西,使用惯用的 "||" 要比使用三元运算符更易读。 - m4ktub
1
为什么引擎不能优化这个?因为函数内可能存在副作用? - user5536315
只要引擎优化了任何副作用或保证没有副作用,它就很可能进行了优化。 - Jon Hanna
@JonHanna 这是真的,但这种分析可能会非常复杂。如果子表达式涉及函数调用,那么运行时很难保证代码不期望副作用。请记住,JavaScript 优化工具没有像优化 C++ 编译器这样的时间预算。 - Pointy
1
是的,但要回答“引擎为什么不能?”我们必须从“谁说不能?”开始。如果操作数是单个变量,则某些引擎可能会这样做;如果操作数是文字,则某些引擎可能会这样做。但是,如果没有引擎这样做,我也不会感到惊讶,因为这不会对性能造成太大影响。 - Jon Hanna
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接