我正在尝试创建一个名为“ 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 '));
答案 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 ')
),则会发生以下情况:
trim(' hello ')
。if
条件-切片字符串并调用trim('hello ')
。if
条件-调用了字符串trim('hello')
。if
条件-输入else
块,将返回'hello'。因此,我们的调用堆栈为trim(' hello ') ==> trim('hello ') ==> trim('hello')
。但是,在您最初编写的函数中,只有对trim
(trim('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;
}