Javascript возвращает неопределенное значение для внутренней функции

#javascript

Вопрос:

Я выполняю простые вопросы с кодом, в которых мы добавляем единицу к числу, цифры которого хранятся в массиве. Моя логика работает хорошо, но возвращаемое значение не определено. Консоль дает правильный ответ. Почему? И как мне это исправить?

 var plusOne = function(digits) {
    addNumber(digits.length - 1, 1, digits)
    
    function addNumber(index, value, digitsArr) {
        let sum = digitsArr[index]   value    
        if(sum > 9) {
            let onesDigit = parseInt(sum.toString().charAt(1))
            digitsArr[index] = onesDigit
            let twosDigit = parseInt(sum.toString().charAt(0))
            addNumber(index-1, twosDigit, digitsArr)
        } else {
          digitsArr[index] = sum
          console.log(digitsArr)
          return digitsArr
        }
    }
};

console.log(plusOne([1,2,9]))
 

Комментарии:

1. plusOne ничего не возвращает. Попробуй return addNumber(...):

2. Попробовал использовать параметры по умолчанию, но не сработало.

Ответ №1:

1) return значение функции addNumber , если вы не вернете что-то из функции, то JS вернет undefined неявно

   return addNumber(digits.length - 1, 1, digits);
 

2) В каждом случае вы должны возвращать значение из addNumber функции. Есть одна из двух вещей, которые вы могли бы сделать

  • return digitsArr от функции addNumber , а не только от else части.
  • возвращение addNumber(index - 1, twosDigit, digitsArr); из того if и возвращение digitsArr из того else .

Основная часть состоит в том, чтобы вернуть что-то из функции, что полностью зависит от того, что именно вы хотите сделать со своим кодом.

 var plusOne = function(digits) {
  return addNumber(digits.length - 1, 1, digits);

  function addNumber(index, value, digitsArr) {
    let sum = digitsArr[index]   value;
    if (sum > 9) {
      let onesDigit = parseInt(sum.toString().charAt(1));
      digitsArr[index] = onesDigit;
      let twosDigit = parseInt(sum.toString().charAt(0));
      addNumber(index - 1, twosDigit, digitsArr);
    } else {
      digitsArr[index] = sum;
    }
    return digitsArr;
  }
};

console.log(plusOne([1, 2, 9])); 

Ответ №2:

PlusOne ничего не возвращает, ни addNumber(индекс-1, двузначный, цифровой)

пробовать:

 var plusOne = function(digits) {
    return addNumber(digits.length - 1, 1, digits)
    
    function addNumber(index, value, digitsArr) {
        let sum = digitsArr[index]   value    
        if(sum > 9) {
            let onesDigit = parseInt(sum.toString().charAt(1))
            digitsArr[index] = onesDigit
            let twosDigit = parseInt(sum.toString().charAt(0))
            return addNumber(index-1, twosDigit, digitsArr)
        } else {
          digitsArr[index] = sum
          console.log(digitsArr)
          return digitsArr
        }
    }
};

console.log(plusOne([1,2,9]))
 

Ответ №3:

Вы вызываете функцию plusOne , которая inturn вызывает внутреннюю функцию addNumber . Это не возвращает никакого значения. Поэтому вместо того, чтобы просто звонить addNumber(digits.length - 1, 1, digits) , вы должны возвращать это значение, например return addNumber(digits.length - 1, 1, digits) . Потому что ваша родительская функция-это ожидание результата выполнения. Так что вам придется дополнить его return заявлением.

Также внутри addNumber функции, когда сумма больше 9, чем при вызове addNumber(index - 1, twosDigit, digitsArr) , вы должны вернуть результат этого выполнения return addNumber(index - 1, twosDigit, digitsArr) . Как и в предыдущем случае, здесь также его исполнитель ожидает ответа от функции.

 var plusOne = function (digits) {
    return addNumber(digits.length - 1, 1, digits);

    function addNumber(index, value, digitsArr) {
        let sum = digitsArr[index]   value;
        if (sum > 9) {
            let onesDigit = parseInt(sum.toString().charAt(1));
            digitsArr[index] = onesDigit;
            let twosDigit = parseInt(sum.toString().charAt(0));
            return addNumber(index - 1, twosDigit, digitsArr);
        } else {
            digitsArr[index] = sum;
            return digitsArr;
        }
    }
};

console.log(plusOne([1, 2, 9])); 

Ответ №4:

В javascript функция, в которой отсутствует явный оператор return, будет возвращать неопределенное значение. Вы вызываете функцию PlusOne, которая, в свою очередь, вызывает(не возвращает) addNumber, но обе функции явно ничего не возвращают, попробуйте вернуть addNumber в обоих случаях.

 var plusOne = function (digits) {
    return addNumber(digits.length - 1, 1, digits);

    function addNumber(index, value, digitsArr) {
        let sum = digitsArr[index]   value;
        if (sum > 9) {
            let onesDigit = parseInt(sum.toString().charAt(1));
            digitsArr[index] = onesDigit;
            let twosDigit = parseInt(sum.toString().charAt(0));
            return addNumber(index - 1, twosDigit, digitsArr);
        } else {
            digitsArr[index] = sum;
            return digitsArr;
        }
    }
};

console.log(plusOne([1, 2, 9]));