为何我的回调函数运行异常?JS字符串处理问题求助
字符串处理逻辑错误排查与修复
问题原因
字符类型未转换导致运算错误
你的addOne和subtractOne函数接收的是字符串类型的字符(比如'3'),直接执行num + 1会触发JavaScript的字符串拼接行为,而非数值加法。例如'3' + 1的结果是'31',这就是测试结果中出现'1231'的核心原因。而减法运算(如'6' - 1)会自动触发类型转换,所以这部分结果是正确的。循环逻辑无功能性错误,但可优化
原循环中遇到A/B时直接跳过的逻辑是正确的,但可以通过主动递增索引来减少不必要的迭代(并非当前错误的根源)。
修复方案
方案1:在回调函数内部转换字符类型
修改addOne和subtractOne函数,先将传入的字符串转换为数值再运算:
const test = '123A456B' function addOne(numStr) { return Number(numStr) + 1 } function subtractOne(numStr) { return Number(numStr) - 1 } function updateString(string) { let result = '' for (let i = 0; i < string.length; i++) { if (string[i] === 'A' || string[i] === 'B') { continue } else if (string[i + 1] === 'A') { result += addOne(string[i]) } else if (string[i + 1] === 'B') { result += subtractOne(string[i]) } else { result += string[i] } } return result } console.log(updateString(test)) // 输出:124455
方案2:调用回调函数时转换类型
如果不想修改回调函数,也可以在调用时先将字符转为数值:
// 保持addOne、subtractOne原有逻辑不变 function addOne(num) { return num + 1 } function subtractOne(num) { return num - 1 } function updateString(string) { let result = '' for (let i = 0; i < string.length; i++) { if (string[i] === 'A' || string[i] === 'B') { continue } else if (string[i + 1] === 'A') { result += addOne(Number(string[i])) } else if (string[i + 1] === 'B') { result += subtractOne(Number(string[i])) } else { result += string[i] } } return result }
可选优化:跳过已处理的A/B字符
当处理完带有A/B的字符后,主动将索引i加1,避免后续迭代到A/B时的空判断:
function updateString(string) { let result = '' for (let i = 0; i < string.length; i++) { if (string[i + 1] === 'A') { result += addOne(Number(string[i])) i++ // 跳过下一个'A'字符 } else if (string[i + 1] === 'B') { result += subtractOne(Number(string[i])) i++ // 跳过下一个'B'字符 } else if (string[i] !== 'A' && string[i] !== 'B') { result += string[i] } } return result }
内容的提问来源于stack exchange,提问作者mimi
相关产品推荐
相关产品推荐

