JS中if语句两种否定判断写法的区别及适用性对比
JS两种if判断写法的差异与规范说明
核心逻辑差异
两种写法的执行逻辑完全不同,根本原因是JS运算符优先级不同:逻辑非!的优先级远高于相等运算符==。
第一种写法:if(value != 'foo') {}
这是标准的不等判断,直接比对value和字符串'foo'的值是否不同,只有当value的值等于'foo'时条件不成立,其余场景都成立,符合预期的「判断value不等于foo」的需求。
举个例子:当value是空字符串''时,'' != 'foo'结果为true,会进入if代码块。
第二种写法:if(!value == 'foo') {}
因为运算符优先级的关系,代码会先执行!value:先把value转成布尔值再取反,得到的结果只会是布尔类型的true或者false,再拿这个布尔值和字符串'foo'做相等判断。
按照JS的隐式类型转换规则,布尔值和字符串做==比较时,会先把布尔值转成数字(true转1,false转0),再和字符串比对,数字和非数字格式的字符串比对结果永远是false,所以这个if的条件永远不会成立,属于逻辑完全错误的写法。
日常开发规范建议
- 优先使用全不等运算符
!==替代!=,避免隐式类型转换带来的不可预期问题,写法为if (value !== 'foo') {},语义清晰,运算逻辑简洁,是最推荐的写法。 - 如果确实需要先判断等值再取反,一定要加括号明确运算优先级,写成
if (!(value == 'foo')) {},这种写法和value != 'foo'逻辑完全等价,但可读性略低于直接用不等判断。 - 绝对不要出现
!value == xxx这类依赖隐式优先级的写法,可读性极差,且大概率会出现逻辑错误。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

