JavaScript中为何函数返回值直接作if条件与和true等值判断执行结果不同?
代码运行现象成因解析
第一个if分支正常执行的原因
if语句判断条件时,会对括号内的表达式执行布尔强制转换(ToBoolean抽象操作):只要值不属于JS定义的固定假值集合,就会被判定为true。
JS中仅有的固定假值集合为:
false- 数值:
0、-0、0n - 空字符串:
""、''、模板语法的空串 nullundefinedNaN
示例中foo()返回非空字符串"bar",不属于上述假值集合,强转后得到布尔值true,因此第一个分支满足执行条件,正常打印输出。
第二个if分支不执行的原因
这里触发的是JS宽松相等(==)的固定转换规则,和if直接强转布尔的逻辑存在本质区别:
宽松相等的比较流程有明确优先级,只要比较的任意一侧是布尔值,就会先将布尔值转换为数字,再开展后续比较:
- 等式中的
true会被先转为数字1,此时比较关系等价于"bar" == 1 - 当比较两侧分别是字符串和数字时,会继续将字符串转换为数字:
"bar"无法被解析为有效数值,转换结果为NaN - 特殊判定规则:
NaN和任何类型的值做相等比较,结果永远为false
因此整个等式的计算结果为false,第二个分支不会进入执行逻辑。
内容的提问来源于stack exchange,提问作者Technikhighknee
相关产品推荐
相关产品推荐

