你们中有谁能使我难以置信和明智的开发人员告诉我为什么
"yes" || true === true ? "no" : null
返回"no"
但是
"yes" || (true === true ? "no" : null)
返回"yes"
?
这让我难过!
OR运算符(||
)是短路运算符,因此一旦找到真实值,就会将其返回。在第二种情况下,您有两个值"yes"
,并且内部有所有内容。由于"yes"
(一个非空字符串)是真实的,因此它将短路以返回该字符串。
[在您的第一种情况下,?
之前的所有内容都隐式分组在一起,因此与说("yes" || true === true) ? "no" : null
相同。由于("yes" || true === true)
评估为真实,因此我们将获得三元组的肯定选项"no"
。
如果Javascript肯定知道值是什么,它将停止评估条件。
JavaScript中的伪造值为0、0n,null,undefined,false,NaN和空字符串“”
由于“ yes”都不是,所以它将始终为true。
在您的第一个示例中:
"yes" || true === true
是条件被评估并且为真,导致三元运算采用真实路径并评估为“否”。
在您的第二个示例中
true === true
是有条件的,但也是正确的,导致三元运算再次采用真实路径并求值为“ no”
但是,当先与“ yes”进行或运算后,javascript会停止评估并仅返回“ yes”
首先,|| (或)返回第一个真值。
所以在这里:
"yes" || true === true ? "no" : null
它将返回“否”,因为"yes" == true
,但不是===因此它将查看第二个值为true的值,以及true === true
,那是正确的。
第二个,将首先执行()中的代码因此,(true === true ? "no" : null)
将返回“否”那么"yes" || "no"
将返回"yes"
,因为它是第一个真值
OR仅用于从左到右评估布尔参数,直到找到第一个真值。如果所有参数不是布尔值,但可以求值,或者返回第一个真实值,则在您的情况下无法求值'(true === true?“ no”:null)',则它返回'yes',因为可以评估的第一个值。
let value = false || '0' || 'true';
console.log(value); //returns '0'
PD:对不起,我的英语不好