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