JavaScript统计打破记录次数异常:预期3次却输出2次求助
问题排查与修复
问题根源
你的代码把分割后的字符串直接拿来比较,而字符串比较是按字符的Unicode码点逐个对比,不是数值大小对比。比如:
- 当循环到第3个元素"8"时,字符串"8"的第一个字符
'8'的码点(56)比"12"的第一个字符'1'的码点(49)大,代码会错误判定"8">"12",把bestPoint更新为"8"。 - 后续的"15"和"20"作为字符串,第一个字符
'1'、'2'的码点都比'8'小,无法触发记录打破的条件,最终统计结果只有2次。
修复方案
把分割后的字符串数组转换成数值数组,确保是数值大小对比。有两种常见方式:
方式1:分割后直接转数值
function gameHistory(gamePoints){ // 分割后用map(Number)转成数值数组 let points = gamePoints.split(", ").map(Number); let recordBreak = 0; let bestPoint = points[0]; for(let i = 1; i<points.length; i++){ if(points[i]>bestPoint){ bestPoint = points[i]; recordBreak += 1; } } console.log(recordBreak); return recordBreak; } gameHistory("10, 12, 8, 15, 20"); // 输出3,符合预期
方式2:比较时临时转数值
function gameHistory(gamePoints){ let points = gamePoints.split(", "); let recordBreak = 0; // 初始值转成数值 let bestPoint = Number(points[0]); for(let i = 1; i<points.length; i++){ // 当前元素转成数值再比较 if(Number(points[i])>bestPoint){ bestPoint = Number(points[i]); recordBreak += 1; } } console.log(recordBreak); return recordBreak; } gameHistory("10, 12, 8, 15, 20"); // 输出3,符合预期
修复后执行流程
- 转换后的数值数组为
[10,12,8,15,20] - 初始
bestPoint=10,recordBreak=0 - i=1:12>10 → 记录+1(变为1),更新
bestPoint=12 - i=2:8<12 → 无操作
- i=3:15>12 → 记录+1(变为2),更新
bestPoint=15 - i=4:20>15 → 记录+1(变为3),更新
bestPoint=20 - 最终输出3,符合预期
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

