Почему вызов моей функции возвращает значение undefined?

#javascript

#javascript

Вопрос:

Я пытаюсь понять, почему, когда я вызываю maxofThree для любого массива, возвращается значение undefined? Я довольно новичок в JS, поэтому ценю вашу помощь!

 function maxofThree (array) {
    for (var i; i < array.length; i  ) {
        var largestNumber = 0;

        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
        return largestNumber;
    }
}
  

Ответ №1:

Вы должны вернуться после цикла, и вы должны начать i с нуля.

 function maxofThree(array) {
    var largestNumber = array[0];
    for (var i=0; i < array.length; i  ) {
        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
    }
    return largestNumber;
}
  

В качестве дополнительного примечания вы также можете использовать Math.max для получения наибольшего числа

 function maxofThree(array) {
    return Math.max.apply(null, array);
}
  

Ответ №2:

 function maxofThree (array) {
    for (var i; i < array.length; i  ) { //the variable i is not initialized i==undefined
       //At each loop you increment i==undefined undefined   equals to NaN
       //So i at first loop is undefined, at second loop is NaN
       //undefined < any number except 0, NaN < any number is always false, so the loop is executed only one time
        var largestNumber = 0; //At each loop you initialize/reset the variable largestNumber  to 0

        if (array[i] > largestNumber) {
            largestNumber = array[i]; //i is NaN, array[NaN]==undefined
            //So largestNumber is always undefined
        }
        return largestNumber; //You return largestNumber before next loop occurs, you return undefined
        //The next loop never occurs, because you have done a return
    }
}
  

Исправленный код:

 function maxofThree (array) {
    var largestNumber = 0; //Initialize largestNumber to 0 before loops occurs
    // I suppose all numbers are positive, otherwise you need to rethink the solution
    for (var i=0; i < array.length; i  ) { //Initialize i to 0
        //At each loop i is incremented until i < array.length

        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
         //The next loop will occurs
    }
    return largestNumber; //At the end of loop you return the largestNumber
}
  

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

1. @Xufox Спасибо, я исправил

Ответ №3:

Вы не инициализировали i , поэтому по умолчанию это undefined . Когда вы производите сравнение i < array.length , undefined преобразуется в число NaN (не число), и поэтому выражение оценивается как false . Это означает, что вы никогда не входите в цикл и никогда не нажимаете оператор return до завершения функции, поэтому он возвращается undefined .

Вы должны инициализировать i в 0 . После этого остаются еще 2 проблемы.

Присвоение 0 значению largestNumber в начале цикла означает, что оно будет сбрасываться на 0 на каждой итерации. Вы должны переместить этот оператор в перед циклом.

Кроме того, наличие return в цикле приведет к немедленному возврату функции в конце первой итерации. Вы должны переместить этот оператор для выполнения после цикла.

Пока мы этим занимаемся, вам следует переименовать функцию. Не похоже, что вы действительно ограничиваете себя 3 элементами (не то чтобы вы когда-либо должны были). Кроме того, array слишком общий. Они должны быть числами, верно? Так что вызывайте их numbers .

Ваша функция должна выглядеть следующим образом:

 function maximum(numbers) {
    var largestNumber = 0;
    for (var i = 0; i < numbers.length; i  ) {
        if (numbers[i] > largestNumber) {
            largestNumber = numbers[i];
        }
    }
    return largestNumber;
}