我的DIY修整函数无法返回正确答案,返回未定义

时间:2019-04-12 14:03:19

标签: javascript return undefined

我正在尝试创建一个名为“ trim”的函数,以删除输入字符串开头和结尾的空格。 (我知道String.prototype.trim可以完成相同的工作,我只是在练习JS),但是它返回“ undefined”,您能帮我吗?

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 '));

2 个答案:

答案 0 :(得分:4)

您需要从要递归的每个地方return,以确保您已将返回的栈一直返回到原始调用者。请参见下面的代码段。

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')。但是,在您最初编写的函数中,只有对trimtrim('hello'))的最后一次调用实际上向先前的调用者返回了一个值-trim的其他调用不返回任何值( undefined)。为了确保将值返回一直传递到trim(' hello ')的原始调用者,您需要确保每次递归return时都会得到递归的结果。< / p>

答案 1 :(得分:0)

仅在str子句中返回else。在每种情况下都必须返回:

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;
}