javascript关于循环停止语句的问题

力扣里做第20题“有效括号”,我输入这个代码在遇到 '{[]}' 的时候会错误地返回 false:

var isValid = function(s) {
    if(s.length % 2 !== 0){
        return false;
    }

    for (let i = 0; i < s.length / 2; i++) {
        s = s.replace("()", "");
        s = s.replace("{}", "");
        s = s.replace("[]", "");
    }

    return s.length === 0;
};

而这个代码就会返回true:

var isValid = function(s) {
    if(s.length % 2 !== 0){
        return false;
    }

    let length = s.length / 2;

    for (let i = 0; i < length; i++) {
        s = s.replace("()", "");
        s = s.replace("{}", "");
        s = s.replace("[]", "");
    }

    return s.length === 0;
};

理论上说停止循环的数值是一样的,可最终结果却不一样,这是为什么呢?

因为你 replace 本身会改变 s.length
两者不等价。

第一个因为for循环中s的值一直在变,而s.length是在循环中获取的,也是一直变的,而第二个中length是固定的,因此循环的次数是固定的,不受s的变化而改变

停止循环使用break;啊

for (var i = 0; i < 10; i++) {
  if (i === 5) {
    break;
  }
  console.log(i);
}