JavaScript中怪异写法isEven函数的运行原理解析
isEven奇偶判断函数原理说明 首先直接回答你的核心疑问:!n不是把数字转为负值,它是JavaScript的逻辑非运算符,作用是将操作值转为布尔类型后取反,运算结果永远是布尔值(true/false)。
涉及的JS基础规则
- 逻辑非
!的转换逻辑:所有假值(0、-0、0n、空字符串、null、undefined、NaN)经过!运算后得到true,其余所有真值经过!运算后得到false。 - 不同类型值做
<=比较时,布尔值会被隐式转为数字:true转成1,false转成0。
逐行拆解代码运行逻辑
你编写的函数代码如下:
function isEven(x){ var m = x % 2 var n = x / 2 return m <= !n }
代入你测试用的非负整数场景,就能看到它为什么能输出符合预期的结果:
- 输入正偶数时(比如x=4):
m=4%2=0,n=4/2=2(非0真值),!n得到false,隐式转数字为0,最终比较0 <= 0,返回true,符合偶数判断结果。 - 输入正奇数时(比如x=3):
m=3%2=1,n=3/2=1.5(非0真值),!n得到false转0,最终比较1 <= 0,返回false,符合奇数判断结果。 - 输入为0时:
m=0%2=0,n=0/2=0(假值),!n得到true转1,最终比较0 <=1,返回true,0属于偶数,判断也符合预期。
注意:这是靠隐式转换凑结果的错误写法
这段代码能跑通仅限非负整数场景,存在明显边界bug:只要输入负整数就会判断失效。比如输入x=-3(奇数):m=-3%2=-1,n=-3/2=-1.5(非0真值),!n得到false转0,比较-1 <= 0会返回true,直接把奇数错判为偶数。
本质上这段代码没有实际工程价值,完全是靠JS类型转换规则在特定输入范围内凑出了正确结果,可读性极差,不建议实际使用。常规奇偶判断直接判断x % 2 === 0即可。
内容的提问来源于stack exchange,提问作者Sandro
相关产品推荐
相关产品推荐

