You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:55:18