2017-02-28 30 views
5

Uzyskanie nieoczekiwanego NaN w ćwiczeniu w Eloquent Javascript rozdział 4, ale błąd nie jest wystarczająco oczywisty, aby mi go odebrać. Czy ktoś mógłby spojrzeć na mój umysł i wskazać mój błąd?Nieoczekiwane wyjście NaN po typof var wyświetla oczekiwany numer typu

/* 
Write a range function that takes two arguments, start and end, and returns an array containing all the numbers from start up to (and including) end. 
*/ 
var numRng = []; 
function range(start, end) { 
    //var numRng = []; 
    cntr = (end - start); 
    for (i = 0; i <= cntr; i++) { 
    numRng.push(start); 
    start++; 
    } // end FOR 
    //return numRng; 
} // end FUNC range 

range(1, 10); 
/*for (i = 0; i < numRng.length; i++) { 
    console.log('Array element ' + numRng.indexOf(1 + i) + ' contains range value: ' + numRng[i]); 
}*/ 

/* 
Next, write a sum function that takes an array of numbers and returns the sum of these numbers. Run the previous program and see whether it does indeed return 55. 
*/ 
var total = 0; 
function sum(numRng) { 
    //var total = 0; 
    for (i = 0; i <= numRng.length; i++) { 
    //console.log(total); 
    total += numRng[i]; 
    //console.log(total);  
    } // end FOR 
    console.log(typeof total); 
    console.log(total);  
} // end FUNC range 

sum(numRng); 
console.log('Total sum of all element values held by array numRng is: ' + total); 

I tu jest wyjście Firebug, wyświetlając że typeof total po pętli w func sumy for jest rzeczywiście number ale jest następnie wyprowadzane jako NaN.

var numRng = []; // seem to require global var ...nt values held by array numRng is: ' + total); 
number 
NaN 
Total sum of all element values held by array numRng is: NaN 

Każda pomoc doceniona.

+2

'typeof (NaN)' to "liczba". Sprawdź wartość 'numRng' – scrappedcola

Odpowiedz

6

Problemem jest tutaj

for (i = 0; i <= numRng.length; i++) 
       ^

numRng[numRng.length] => nieokreślonej
poprawiłam poniższy kod

var numRng = []; 
 
function range(start, end) { 
 
    //var numRng = []; 
 
    cntr = (end - start); 
 
    for (i = 0; i <= cntr; i++) { 
 
    numRng.push(start); 
 
    start++; 
 
    } 
 
} 
 

 
range(1, 10); 
 

 

 
var total = 0; 
 
function sum(numRng) { 
 
    for (i = 0; i < numRng.length; i++) { 
 
    total += numRng[i]; 
 
    } 
 
    console.log(typeof total); 
 
    console.log(total);  
 
} 
 
sum(numRng); 
 
console.log('Total sum of all element values held by array numRng is: ' + total);

+3

Ah właśnie widzę problem:' <= 'w pętli tablicy, która zaczyna się od 0 na' tablica.length - 1'. Tak więc został zapętlony niezdefiniowany element tablicy, który spowodował, że 'total' przeszedł NaN, jak sądzę. Thanx. – scriptz

+3

w prawo. możesz użyć albo '<= array.length-1' lub'

3

Jedyny błąd jest to, że masz

for (i = 0; i <= numRng.length; i++) 

które powinny być

for (i = 0; i < numRng.length; i++) 

długość tablicy jest ostatni wskaźnik + 1; więc przy użyciu < = w końcowej iteracji pętli numRng [i] będzie niezdefiniowana, a dodanie liczby do niezdefiniowanej da ci NaN.