为什么这个函数在第一次迭代后不退出?

Why doesn't this function exit after the first iteration?

我确实理解以下函数的一般工作原理。但是为什么它在第一次迭代后不退出(当有回文时)?它检查 if 语句中的第一个字符和最后一个字符,这是真的,应该(在我的逻辑中)执行 return 语句......感谢您帮助解释这个! :)

function palindrome(str) {
  var lowerCaseStr = str.toLowerCase();
  for (var i = 0; i < lowerCaseStr.length; i++)
  debugger;
    if (lowerCaseStr[i] === lowerCaseStr[lowerCaseStr.length - i - 1]){
      return true;
    }
  return false;
}

您需要切换逻辑,检查不等式和return false。如果到达终点,return true.

function palindrome(str) {
    var lowerCaseStr = str.toLowerCase();
    for (var i = 0; i < lowerCaseStr.length; i++) {
        debugger;
        if (lowerCaseStr[i] !== lowerCaseStr[lowerCaseStr.length - i - 1]) {
            return false;
        }
    }
    return true;
}

它不会在第一次迭代后退出,而是在 lowerCaseStr.length 次迭代后退出,因为您的代码等同于下面的代码

function palindrome(str) {
  var lowerCaseStr = str.toLowerCase();
  for (var i = 0; i < lowerCaseStr.length; i++){ 
      debugger;
  }

  if (lowerCaseStr[lowerCaseStr.length] === lowerCaseStr[-1]){
      return true;
  }

  return false;
}

也就是说,它迭代 lowerCaseStr.length; 次,但它对每次迭代所做的唯一事情是调用 debugger 之后它测试数组中不存在的元素。 (两个指数都超出范围)。这导致两次比较 undefined undefined === undefined 总是正确的。

作为侧节点,如果您 return 根据布尔表达式为真或假,则考虑使用一个 return 语句:

return (lowerCaseStr[i] === lowerCaseStr[lowerCaseStr.length - i - 1]);