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

为何JavaScript回文函数中使用stk.length时循环仅执行4次?

问题:修改循环条件后为何只执行4次?

第一段代码运行完全正常:

const isPalindrome = word => {
    const stk = [];
    let rword = "";
    
    for(let i = 0; i < word.length; i++){
        stk.push(word[i]);
    }
    console.log(stk)
    console.log(stk.length)
    for(let i = 0; i < word.length; i++){
        rword += stk.pop();
        console.log(rword)
    }
   
    return word === rword;
}

console.log(isPalindrome("racecar"))

但把第二个循环的条件改成stk.length后,循环仅执行4次,这是为什么?

修改后的代码:

const isPalindrome = (word) => {
  const stk = [];
  let rword = "";

  for (let i = 0; i < word.length; i++) {
    stk.push(word[i]);
  }
  console.log(stk);
  console.log(stk.length);
  for (let i = 0; i < stk.length; i++) {
    rword += stk.pop();
    console.log(rword);
  }

  return word === rword;
};

console.log(isPalindrome("racecar"));

原本期望两段代码运行结果一致。


原因解析

核心问题出在**stk.length是动态变化的**,而word.length是固定值。

拿输入"racecar"来说,它的长度是7,第一段代码的第二个循环会从i=0执行到i=6,总共7次,每次pop()都会把栈里的元素取空,最终rword会得到完整的反转字符串"racecar"。

但第二段代码的循环条件是i < stk.length,初始时stk.length是7,循环过程中每次stk.pop()都会让栈的长度减1,同时i每次循环都会加1,两者的对比变化如下:

  • 第1次循环:i=0,stk.length=7 → 满足条件,执行pop,stk.length变为6,i变为1
  • 第2次循环:i=1,stk.length=6 → 满足条件,执行pop,stk.length变为5,i变为2
  • 第3次循环:i=2,stk.length=5 → 满足条件,执行pop,stk.length变为4,i变为3
  • 第4次循环:i=3,stk.length=4 → 满足条件,执行pop,stk.length变为3,i变为4
  • 第5次循环:i=4,stk.length=3 → 4 < 3 不成立,循环直接终止

这就导致循环只执行了4次,rword只拼接了4个字符("race"),自然和原字符串不相等。

如果想让循环条件用stk.length且执行完整次数,有两种解决办法:

  • 提前把栈的长度存成固定变量:
    const len = stk.length;
    for (let i = 0; i < len; i++) {
      rword += stk.pop();
    }
    
  • 改用while循环,直接判断栈是否为空:
    while (stk.length > 0) {
      rword += stk.pop();
    }
    

内容的提问来源于stack exchange,提问作者Lakhwinder Sidhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:01:04