从Java中的AND返回到三元运算符时出现意外结果

问题描述 投票:0回答:4

你们中有谁能使我难以置信和明智的开发人员告诉我为什么

"yes" || true === true ? "no" : null

返回"no"

但是

"yes" || (true === true ? "no" : null)

返回"yes"

这让我难过!

javascript conditional-statements conditional-operator
4个回答
1
投票

OR运算符(||)是短路运算符,因此一旦找到真实值,就会将其返回。在第二种情况下,您有两个值"yes",并且内部有所有内容。由于"yes"(一个非空字符串)是真实的,因此它将短路以返回该字符串。

[在您的第一种情况下,?之前的所有内容都隐式分组在一起,因此与说("yes" || true === true) ? "no" : null相同。由于("yes" || true === true)评估为真实,因此我们将获得三元组的肯定选项"no"


0
投票

如果Javascript肯定知道值是什么,它将停止评估条件。

JavaScript中的伪造值为0、0n,null,undefined,false,NaN和空字符串“”

由于“ yes”都不是,所以它将始终为true。

在您的第一个示例中:

"yes" || true === true 

是条件被评估并且为真,导致三元运算采用真实路径并评估为“否”。

在您的第二个示例中

true === true

是有条件的,但也是正确的,导致三元运算再次采用真实路径并求值为“ no”

但是,当先与“ yes”进行或运算后,javascript会停止评估并仅返回“ yes”


0
投票

首先,|| (或)返回第一个真值。

所以在这里:

"yes" || true === true ? "no" : null

它将返回“否”,因为"yes" == true,但不是===因此它将查看第二个值为true的值,以及true === true,那是正确的。

第二个,将首先执行()中的代码因此,(true === true ? "no" : null)将返回“否”那么"yes" || "no"将返回"yes",因为它是第一个真值


0
投票

OR仅用于从左到右评估布尔参数,直到找到第一个真值。如果所有参数不是布尔值,但可以求值,或者返回第一个真实值,则在您的情况下无法求值'(true === true?“ no”:null)',则它返回'yes',因为可以评估的第一个值。

let value = false || '0' || 'true';

console.log(value); //returns '0'

PD:对不起,我的英语不好

© www.soinside.com 2019 - 2024. All rights reserved.