三元运算符是否可以等效于与逻辑运算符短路?
Can the ternary operator be equivalent to short circuiting with the logical operators?
通过短路可以防止对表达式的一部分求值:
let x = "", y = 123;
x && alert("foo"); // ""
y || alert("bar") // 123
由于逻辑操作形成表达式,您可以在函数调用或 return 语句中使用它们。
但归根结底,这只不过是条件分支,可以使用三元运算符轻松实现:
x ? alert("foo") : x; // ""
y ? y : alert("bar"); // 123
这更具可读性,同样简洁。除了说明性术语外,是否有理由使用逻辑运算符的短路 属性?
这是真的(好吧,几乎是真的)
x ? x : y
在逻辑上等同于
x || y
但是,就代码运行时发生的情况而言,它们并不相同。在 ? :
的情况下,子表达式 x
可能被计算 两次 。在 x || y
中,它肯定只计算一次。对于简单的变量引用,这无关紧要,但如果 x
是一个函数调用,它可能会影响行为并且肯定会影响性能。
(其中一个表达式可能被计算两次的事实是我在第一句中的 "almost" 的意思。)
通过短路可以防止对表达式的一部分求值:
let x = "", y = 123;
x && alert("foo"); // ""
y || alert("bar") // 123
由于逻辑操作形成表达式,您可以在函数调用或 return 语句中使用它们。
但归根结底,这只不过是条件分支,可以使用三元运算符轻松实现:
x ? alert("foo") : x; // ""
y ? y : alert("bar"); // 123
这更具可读性,同样简洁。除了说明性术语外,是否有理由使用逻辑运算符的短路 属性?
这是真的(好吧,几乎是真的)
x ? x : y
在逻辑上等同于
x || y
但是,就代码运行时发生的情况而言,它们并不相同。在 ? :
的情况下,子表达式 x
可能被计算 两次 。在 x || y
中,它肯定只计算一次。对于简单的变量引用,这无关紧要,但如果 x
是一个函数调用,它可能会影响行为并且肯定会影响性能。
(其中一个表达式可能被计算两次的事实是我在第一句中的 "almost" 的意思。)