JavaScript最大最小数字计算错误:为何6被判定为大于542?
问题分析与修复方案
你碰到的这个问题其实很典型——JavaScript里的字符串比较和数字比较逻辑完全不一样!
咱们来看你的代码:当你用numbers.split(" ")处理输入字符串后,得到的数组里每一项都是字符串类型(比如"6"、"542"),而不是数字。JavaScript在比较字符串时,是按字符的Unicode编码逐个对比的:拿"6"和"542"来说,先看第一个字符,"6"的编码值比"5"高,所以会直接判定"6" > "542",这就是为什么你的程序会把6当成最大数返回。
当你移除6之后,剩下的字符串里最大的数字是542,它的首字符"5"比其他所有数字字符串的首字符都大,所以字符串比较的结果刚好和数字比较一致,程序就正常了。
修复方法
有两种简单的修复思路:
思路1:分割后直接转成数字数组
在分割完字符串后,用map(Number)把每个元素转换成数字类型,之后的比较就都是正常的数字大小对比了:
function highAndLow(numbers){ // 将分割后的字符串数组转为数字数组 numbers = numbers.split(" ").map(Number); var biggest = numbers[0]; for (i = 0; i < numbers.length; i++) { if (numbers[i] > biggest) { biggest = numbers[i]; } } var smallest = numbers[0]; for (i = 0; i < numbers.length; i++) { if (numbers[i] < smallest) { smallest = numbers[i]; } } return biggest + " " + smallest; } console.log(highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"));
思路2:比较时临时转成数字
如果不想修改原数组的类型,可以在每次比较的时候,把字符串转成数字再对比:
function highAndLow(numbers){ numbers = numbers.split(" "); var biggest = numbers[0]; for (i = 0; i < numbers.length; i++) { // 比较时转成数字 if (Number(numbers[i]) > Number(biggest)) { biggest = numbers[i]; } } var smallest = numbers[0]; for (i = 0; i < numbers.length; i++) { // 比较时转成数字 if (Number(numbers[i]) < Number(smallest)) { smallest = numbers[i]; } } return biggest + " " + smallest; }
进阶简化写法
其实还可以用Math.max和Math.min来简化代码,不用手动写循环:
function highAndLow(numbers){ const numArr = numbers.split(" ").map(Number); // 扩展运算符展开数组,直接获取最大和最小值 return `${Math.max(...numArr)} ${Math.min(...numArr)}`; }
这样修改后,运行你的测试用例就能得到预期的542 -214了。
内容的提问来源于stack exchange,提问作者Eme-rald
相关产品推荐
相关产品推荐

