从 Javascript 中的和或中回退到三元运算符时出现意外结果
Unexpected result when falling back to a ternary operator from and OR in Javascript
你们当中有谁能告诉我原因吗
"yes" || true === true ? "no" : null
returns "no"
但是
"yes" || (true === true ? "no" : null)
returns "yes"
?
难倒我了!
OR 运算符 (||
) 是一个短路运算符,因此一旦它找到一个真值,它就会 return 得到它。在第二种情况下,您有两个值 "yes"
,所有内容都在括号内。由于 "yes"
,一个非空字符串,是真实的,它会短路到 return that.
在你的第一种情况下,?
之前的所有内容都隐含地组合在一起,所以它与说 ("yes" || true === true) ? "no" : null
相同。由于 ("yes" || true === true)
的计算结果为真,我们将得到三元的肯定选项,"no"
。
Javascript 如果确定知道值是什么,将停止评估条件。
JavaScript 中的假值为 0、0n、null、undefined、false、NaN 和空字符串 ""
由于 "yes" 是其中的 none,因此它的计算结果始终为真。
在你的第一个例子中:
"yes" || true === true
条件是否正在评估并且为真,导致三元运算采用真实路径并评估为 "no"。
在你的第二个例子中
true === true
是有条件的,但也是真的,导致三元运算再次采用真实路径并评估为 "no"
然而,当首先与 "yes" 进行或运算时,javascript 停止计算并简单地 returns "yes"
首先,|| (或)return第一个真值。
所以在这里:
"yes" || true === true ? "no" : null
它会 return "no" 因为 "yes" == true
但不是 ===
所以它会查看第二个值是真的,true === true
,没错。
第二个,会先执行()里面的代码
所以,(true === true ? "no" : null)
将 return "no"
然后 "yes" || "no"
将 return "yes"
因为它第一个真值
OR 仅用于计算布尔参数,从左到右,直到找到第一个真值。如果所有参数都不是布尔值但可以被评估或 returns 第一个真值,在你的情况下 '(true === true? "no": null)' 不能被评估,那么它 returns 'yes' 因为是第一个可以计算的值。
let value = false || '0' || 'true';
console.log(value); //returns '0'
PD:抱歉我的英语不好
你们当中有谁能告诉我原因吗
"yes" || true === true ? "no" : null
returns "no"
但是
"yes" || (true === true ? "no" : null)
returns "yes"
?
难倒我了!
OR 运算符 (||
) 是一个短路运算符,因此一旦它找到一个真值,它就会 return 得到它。在第二种情况下,您有两个值 "yes"
,所有内容都在括号内。由于 "yes"
,一个非空字符串,是真实的,它会短路到 return that.
在你的第一种情况下,?
之前的所有内容都隐含地组合在一起,所以它与说 ("yes" || true === true) ? "no" : null
相同。由于 ("yes" || true === true)
的计算结果为真,我们将得到三元的肯定选项,"no"
。
Javascript 如果确定知道值是什么,将停止评估条件。
JavaScript 中的假值为 0、0n、null、undefined、false、NaN 和空字符串 ""
由于 "yes" 是其中的 none,因此它的计算结果始终为真。
在你的第一个例子中:
"yes" || true === true
条件是否正在评估并且为真,导致三元运算采用真实路径并评估为 "no"。
在你的第二个例子中
true === true
是有条件的,但也是真的,导致三元运算再次采用真实路径并评估为 "no"
然而,当首先与 "yes" 进行或运算时,javascript 停止计算并简单地 returns "yes"
首先,|| (或)return第一个真值。
所以在这里:
"yes" || true === true ? "no" : null
它会 return "no" 因为 "yes" == true
但不是 ===
所以它会查看第二个值是真的,true === true
,没错。
第二个,会先执行()里面的代码
所以,(true === true ? "no" : null)
将 return "no"
然后 "yes" || "no"
将 return "yes"
因为它第一个真值
OR 仅用于计算布尔参数,从左到右,直到找到第一个真值。如果所有参数都不是布尔值但可以被评估或 returns 第一个真值,在你的情况下 '(true === true? "no": null)' 不能被评估,那么它 returns 'yes' 因为是第一个可以计算的值。
let value = false || '0' || 'true';
console.log(value); //returns '0'
PD:抱歉我的英语不好