Я пытаюсь создать функцию с именем «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
toggler 12 Апр 2019 в 17:03

2 ответа

Лучший ответ

Вам нужно 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, вы являетесь рекурсивный. Если вы берете строку ' hello ' и вызываете trim как (trim(' hello ')), происходит следующее:

  1. Позвоните trim(' hello ').
  2. Первое условие if выполнено - строка разрезана и вызывается trim('hello ').
  3. Второе условие if выполнено - вызывается строка trim('hello').
  4. Условие if не выполнено - блок else введен, `'привет', возвращается.

Таким образом, наш стек вызовов trim(' hello ') ==> trim('hello ') ==> trim('hello'). Однако в той функции, в которой вы ее изначально написали, только последний вызов trim (trim('hello')) фактически возвращает значение предыдущему вызывающему - остальные вызовы trim ничего не возвращают ( undefined ) . Чтобы убедиться, что возвращаемое значение передается полностью обратно исходному вызывающему объекту trim(' hello '), вам необходимо убедиться, что каждый раз, когда вы повторяете вам return результат рекурсии.

4
Alexander Nied 12 Апр 2019 в 14:29

Вы возвращаете свой 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;
}
0
Mojo Allmighty 12 Апр 2019 в 14:06