关于JavaScript getMiddle函数与slice直接调用结果不一致的求助
问题排查:getMiddle函数与直接调用slice结果不一致的原因
我正在解决一道JavaScript算法题,要求从奇数长度字符串中提取中间单个字符,偶数长度字符串提取中间两个字符。我编写了getMiddle函数,但调用getMiddle("test")的返回值,和直接执行console.log("test".slice(Math.floor("test".length / 2 - 1), Math.floor("test".length / 2 + 1)))的结果不同,两段代码逻辑看似一致却结果不符,求排查原因。
附上我的代码:
function getMiddle(s) { //Code goes here! let answer = ""; if (s.length % 2 !== 0) { answer += s[Math.floor(s.length / 2)]; } } else { answer += s.slice( (Math.floor(s.length / 2 - 1), Math.floor(s.length / 2 + 1)) ); } return answer; } console.log(getMiddle("test")); console.log( "test".slice( Math.floor("test".length / 2 - 1), Math.floor("test".length / 2 + 1) ) );
错误原因
核心问题出在slice的参数传递上:你在函数里把两个Math.floor表达式用括号包裹了,这触发了JavaScript的逗号运算符。逗号运算符的行为是依次执行所有表达式,最后返回最后一个表达式的结果——也就是说,你实际只给slice传了一个参数:Math.floor(s.length / 2 + 1)。
以"test"(长度4)为例:
- 你函数里的调用等价于
s.slice(3),这会从索引3开始截取到字符串末尾,得到结果"t"; - 而正确的调用应该是
s.slice(1, 3),才能得到中间两个字符"es"。
修正后的代码
function getMiddle(s) { let answer = ""; if (s.length % 2 !== 0) { answer += s[Math.floor(s.length / 2)]; } else { // 移除参数外的括号,用逗号分隔两个参数 answer += s.slice( Math.floor(s.length / 2 - 1), Math.floor(s.length / 2 + 1) ); } return answer; }
额外优化
因为当字符串长度为偶数时,s.length / 2本身就是整数,不需要Math.floor,可以简化代码:
function getMiddle(s) { const mid = Math.floor(s.length / 2); return s.length % 2 === 0 ? s.slice(mid - 1, mid + 1) : s[mid]; }
内容的提问来源于stack exchange,提问作者melon-candy
相关产品推荐
相关产品推荐

