JavaScript中!typeof str == "string"和typeof str != "string"的区别
两种条件判断写法的差异核心原因
1. 本质是运算符优先级导致的执行顺序差异
JavaScript中逻辑非运算符!的优先级高于相等运算符==/!=,所以两种写法的实际执行逻辑完全不同:
写法1:!typeof str == "string"的实际执行流程
会被JS引擎默认解析为:
(!typeof str) == "string"
- 第一步执行
typeof str,返回的始终是字符串类型的结果,比如"string"、"number"、"undefined"等 - 第二步对上述字符串结果做
!运算:所有非空字符串的布尔值都是true,取非后固定得到false - 第三步执行
false == "string",结果永远为false
这就是该判断永远不会按预期触发的原因,完全不符合「判断输入不是字符串」的需求。
写法2:typeof str != "string"的实际执行流程
会被JS引擎默认解析为:
(typeof str) != "string"
typeof运算符优先级高于不等运算符!=,先执行typeof str得到类型字符串- 直接和
"string"做不等比较:输入是字符串时返回false,输入不是字符串时返回true,完全符合判断需求。
补充说明
如果你习惯用逻辑非的写法表达「不是字符串」的判断,需要手动加括号调整执行优先级:!(typeof str === "string"),和你修改后的正确写法逻辑完全等价,且推荐使用严格相等===避免隐式类型转换带来的潜在问题。
内容的提问来源于stack exchange,提问作者TheWolfHunter
相关产品推荐
相关产品推荐

