JS使用对象统计字符串字符数时相似函数结果异常原因求解
问题原因分析
第一段代码统计异常原因
第一段代码的核心问题是obj[char] = 1的执行没有分支限制,无论if判断是否命中,每次遍历到对应字符都会执行这行赋值逻辑:
- 首次遍历到某字符时:
obj[char]不存在,if判断不触发,直接执行obj[char] = 1,计数为1 - 后续再次遍历到相同字符时:if判断命中,
obj[char]先加1,紧接着又被obj[char] = 1覆盖为1,所以所有字符最终计数永远为1,和实际出现次数不符。
第二段代码统计异常原因
第二段代码的问题是累加逻辑没有分支限制,无论if判断是否命中,每次遍历都会执行obj[char] += 1:
- 首次遍历到某字符时:
obj[char]不存在,if判断命中,先执行obj[char] = 1,紧接着执行累加变成2,初始计数就多算了1次 - 后续再次遍历到相同字符时:if判断不触发,直接累加1,计数逻辑正常。最终所有字符的计数都会比实际出现次数多1,和你给出的结果完全吻合。
正确的实现写法
可以选择以下任意一种写法实现准确统计:
写法1:分支明确赋值
function maxChar(str) { let obj = {} for(let char of str){ if(obj[char]){ obj[char] += 1 } else { obj[char] = 1 } } console.log(obj) }
写法2:简化默认值处理
function maxChar(str) { let obj = {} for(let char of str){ obj[char] = (obj[char] || 0) + 1 } console.log(obj) }
内容的提问来源于stack exchange,提问作者d14bl0
相关产品推荐
相关产品推荐

