【问题标题】:Why doesn't this function exit after the first iteration?为什么这个函数在第一次迭代后不退出?
【发布时间】:2017-09-09 11:56:56
【问题描述】:

我确实了解以下功能的一般工作原理。但是为什么它在第一次迭代后不退出(当有回文时)?它检查 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;
}

【问题讨论】:

  • 顺便说一句,你只迭代debugger

标签: javascript function return palindrome


【解决方案1】:

它不会在第一次迭代后退出,而是在 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 这总是正确的。

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

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

【讨论】:

    【解决方案2】:

    你需要切换逻辑,检查不等式并返回false。如果到达终点,返回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;
    }
    

    【讨论】:

    • 1.为什么这和我的方式有什么不同? 2.回到我的问题:为什么函数(循环)在比较前两个字符后没有停止?谢谢!
    • 检查不相等但不相等是不同的,并且返回值也会切换,true变成false,反之亦然。您以第一个找到的相同字符退出,但您不需要检查相同性,而是检查不等式。
    猜你喜欢
    • 2019-08-29
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2021-05-24
    • 2017-02-12
    相关资源
    最近更新 更多