【问题标题】:my DIY trim function cannot return correct answer, it returns undefied我的 DIY 修剪功能无法返回正确答案,它返回未定义
【发布时间】:2019-09-03 07:49:22
【问题描述】:

我正在尝试创建一个名为“trim”的函数来删除输入字符串头部和尾部的空白。 (我知道 String.prototype.trim 可以做同样的工作,我只是在练习我的 JS)但是它返回“未定义”,你能帮帮我吗?

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        trim(str);
    } else {
        return str;
    }
}

console.log(trim('  ab c '));

【问题讨论】:

  • 你需要在前两个块中return trim(str)

标签: javascript return undefined


【解决方案1】:

您需要从您递归的每个地方return,以确保您已将堆栈一路返回给原始调用者。请参阅下面的 sn-p。

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        return trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        return trim(str);
    } else {
        return str;
    }
}

console.log(trim('  ab c '));

更多上下文:

每次从trim 函数体内调用trim 时,您就是recursing。如果您将字符串' hello ' 调用为trim 为(trim(' hello ')),则会发生以下情况:

  1. 致电trim(' hello ')
  2. 满足第一个if 条件- 对字符串进行切片并调用trim('hello ')
  3. 满足第二个if 条件- 调用字符串trim('hello')
  4. 不满足if 条件-- 输入else 块`返回'hello'。

所以我们的调用堆栈是trim(' hello ') ==> trim('hello ') ==> trim('hello')。但是,在您最初编写的函数中,只有最后一次调用 trim (trim('hello')) 实际上会向前一个调用者返回一个值——trim 的其他调用什么也不返回 (undefined)。为了确保返回的值一直传递回trim(' hello ') 的原始调用者,您需要确保每次递归return 时都是递归的结果。

【讨论】:

  • 对不起,我对“为了确保你已经将堆栈一路返回给原始调用者”这句话感到困惑,你能解释一下吗?非常感谢。
  • @toggler - 我在答案中提供了更多上下文,请查看是否有帮助。
  • 我想我现在明白了。就像:function fn1(){ function fn2(){ return 1; } fn2(); } fn1(); //在您向我解释之前未定义,我认为一个“返回”可以通过调用者链。现在我知道我错了。再次感谢您!
  • 是的,你的总结是正确的——你现在明白了。乐意效劳。如果答案足够有帮助,您可以将其标记为“已接受”,以便让其他访问者知道它对您有用。但是,如果它以任何方式不足,您没有义务这样做。编码愉快!
【解决方案2】:

您仅在 else 子句中返回您的 str。在任何情况下都必须返回:

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        trim(str);
    }
    return str;
}

【讨论】:

  • 我想你可能想重新审视这个答案——如果你用" hello " 调用它,它会返回"hello ",并且没有修剪尾随空格。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多