数组求和中sum%2与sum%2==0的区别及取余运算符疑问
关于JavaScript取余运算符(%)的布尔判断逻辑问题
我在解决CodeWars问题时,对取余运算符(%)的工作原理产生了困惑,想了解表达式10 % 2与9 % 2对应的布尔判断逻辑。
原CodeWars题目说明
给定一个整数列表,判断其元素之和是奇数还是偶数,返回字符串"odd"或"even";若输入数组为空,则视为[0]。
以下两种解决方案均可正常运行:
function oddOrEven(array) { let sum = array.reduce( (acc, c) => acc + c, 0 ) return sum % 2 ? "odd" : "even" }
function oddOrEven(array) { let sum = array.reduce( (acc, c) => acc + c, 0 ) return sum % 2 == 0 ? "even" : "odd" }
核心疑问
像sum % 2这样的取余表达式到底返回什么?根据三元表达式的逻辑,第一个解决方案能正常工作意味着当存在余数时,sum % 2会被视为true,这是否正确?
解答
首先明确JavaScript中取余运算符的返回值:
10 % 2的结果是0,因为10能被2整除,没有余数;9 % 2的结果是1,因为9除以2商4余1。
然后要理解JavaScript的布尔类型隐式转换规则:在条件判断场景(比如三元表达式的条件位置)中,非布尔值会被自动转换为布尔值:
- 数字0会被转换为
false; - 任何非0的数字(包括1、-1、2等)都会被转换为
true。
基于这两点,就能解释两个解法的逻辑:
- 第一个解法的逻辑:
- 当sum是奇数时,
sum % 2返回1(非0值),被转换为true,因此三元表达式返回"odd"; - 当sum是偶数时,
sum % 2返回0,被转换为false,因此返回"even",完全符合题目要求。
- 当sum是奇数时,
- 第二个解法的逻辑:
- 直接判断取余结果是否等于0,等于0说明sum是偶数,返回"even";否则sum是奇数,返回"odd",逻辑更直观直白。
你的判断是正确的:当存在余数(即sum为奇数,余数为1)时,sum % 2会被视为true,这正是第一个解法能正常运行的核心原因。
内容的提问来源于stack exchange,提问作者Chris Nelson
相关产品推荐
相关产品推荐

