Javascript 使用'&&';和'||';在三元运算符(';?';和';:';)上?

Javascript 使用'&&';和'||';在三元运算符(';?';和';:';)上?,javascript,conditional,conditional-operator,Javascript,Conditional,Conditional Operator,在JavaScript中,使用 true ? 'Hello' : 'Goodbye' //Evaluates to "Hello" false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye" 及 第一种情况是内联if语句的示例,而第二种情况是逻辑谓词的示例。三元运算符 这是if-else的缩写 true ? 'Hello' : 'Goodbye' 相当于 if (true) { 'Hello' } else { 'Goodbye

在JavaScript中,使用

true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"

false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"


第一种情况是内联if语句的示例,而第二种情况是逻辑谓词的示例。

三元运算符 这是
if-else
的缩写

true ? 'Hello' : 'Goodbye'
相当于

if (true) {
    'Hello'
} else {
    'Goodbye'
}
(true && 'Hello') || 'Goodbye'
逻辑谓词 而
true&&“Hello”| |“再见”
不是
if-else
条件

true && 'Hello' || 'Goodbye'
相当于

if (true) {
    'Hello'
} else {
    'Goodbye'
}
(true && 'Hello') || 'Goodbye'
这会导致
Hello
,但它是基于优先级的。考虑

'Goodbye' || (true && 'Hello')

这将导致
再见
。改变顺序会改变输出,但三元运算符不会发生这种情况。

这是两个不同的概念,恰好给出了相同的答案


第一个示例使用and,其结果仅取决于第一个操作数(在您的示例中
true
/
false
):

它是
if
/
else
的简写形式。如果第一个操作数为truthy,则返回第二个操作数(
Hello
)。如果第一个操作数为falsy,则返回第三个操作数(
再见

第一个示例的第一个表达式可以重写为:

if (true)
    return 'Hello';
else
    return 'Goodbye';

第二个示例使用and,其结果取决于第一个和第二个操作数

true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"
如果
firstOperand&&secondOperand
的计算结果为真实值,则返回
secondOperand
。如果他们的评估结果不正确,请返回
thirdOperand
再见

在您的示例中,由于非空字符串是truthy,
true&&“Hello”
的计算结果为
Hello
,而
false&“Hello”
的计算结果为
false

true ? 'Hello' : 'Goodbye'
第二个例子变成:

'Hello' || 'Goodbye'
false || 'Goodbye'
由于工作方式的不同,第一个示例的输出正好是这样,但它们是不同的概念


请注意,在第一个示例中,我们知道在计算第一个操作数后返回什么。在第二个示例中,我们必须先计算前两个操作数,然后才能知道返回什么。

结果似乎没有差别。但我猜他们是怎么处理的
()?:
实际上比
和&&&|
快一点点(参见下面的演示)

(A)B?C:
基本上是一个IF速记,因此对
(A)
部分进行求值,然后选择
B
C else
堆栈

(A)和&B|C
得到完全评估。首先计算
(A)
。之后会发生一些事情,这需要一些时间

错误-thx至“Gust van de Wal”

还是有区别:

var max=1e7;
var start1=(新日期()).getTime();
对于(变量i=0;i控制台日志(stop2-start2)后者取决于
“Hello”
处的值是否真实。考虑<代码>真与假>真< /代码> vs>代码>真的吗?false:true
第一个在我看来更具可读性。这肯定是一件事,尽管实际上还有另一个区别。它对于无分支代码很有用。这可以防止分支预测失败。我的观点是,你的答案中有一个错误。“A&B|C被完全评估”是不真实的,如果A和B都是真实的,你是对的!看一看。只有一种情况仍然存在差异。还有“仍然”吗?短路解释了这种行为,所以我真的不明白你在说什么