2015-06-10 34 views
5

Cosa c'è di sbagliato con questo codice?Somma dell'intervallo di numeri in un array (funzione di richiamata)

function range(start, end){ 
    var arrayRange = []; 
    for(i= start; i<=end; i++){ 
    arrayRange.push(i) 
    } 
    return(arrayRange); 
} 
var r = range(1,10); 
console.log(r); 

function sumRange(sumArray){ 
    var total = 0; 

for(var i=0; i <= sumArray.length; i++){ 
    total = total + sumArray[i]; 
} 
    return total; 
} 

var s=sumRange(r); 
console.log(s); 

Questo è ciò che viene visualizzato nella console.

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
NaN 

Sto provando un esercizio da Eloquent Javascript per capire la funzione di callback. Il mio obiettivo è quello di produrre questa

console.log(sum(range(1,10))); 
// 55 
+0

Per iniziare, sono necessarie due funzioni distinte 'somma' e' intervallo' per soddisfare la vostra mira. Attualmente stai definendo 'sumRange' come uno nel tuo codice? –

+0

'var i = 0; i sobolevn

risposta

2

Il problema è i <= sumArray.length, gli indici di matrice vanno da 0 a length -1 così la condizione del ciclo deve essere i < sumArray.length

Nel suo caso l'ultima iterazione del ciclo sarà total + undefined che tornerà NaN

function sumRange(sumArray) { 
    var total = 0; 
    for (var i = 0; i < sumArray.length; i++) { 
     total = total + sumArray[i]; 
    } 
    return total; 
} 

È possibile utilizzare Array.reduce() come

function sumRange(sumArray) { 
    return sumArray.reduce(function (sum, val) { 
     return sum + val; 
    }, 0); 
} 
+0

Oh uomo! Mi sento sciocco. Arun, puoi mostrarmi come far funzionare questa linea? console.log (somma (intervallo (1,10))); per produrre 55 in console –

+0

@AnoopChandran http://jsfiddle.net/arunpjohny/m9f5xuns/1/ –

1

In questa parte della funzione sum:

for(var i=0; i <= sumArray.length; i++){ 
    total = total + sumArray[i]; 
} 

Perché la vostra condizione è i <= sumArray.length invece di i < sumArray.length, si tenta di accedere ad un indice di matrice che non è stato impostato. Quando lo fai, JavaScript produrrà undefined come valore e undefined quando aggiunto a qualsiasi numero, produrrà NaN.

Il valore NaN è fondamentalmente il modo di JavaScript del ti permette di sapere che qualcosa è andato storto nei calcoli, senza in realtà essere abbastanza utile per dirvi dove è andata male. Anche la modalità rigorosa non modificherà questo comportamento, quindi devi solo fare attenzione quando lavori con gli array per evitare l'accesso a chiavi non definite. A proposito, lo stesso comportamento esiste quando si tenta di accedere a chiavi di oggetti non definite (in JavaScript, gli array sono solo casi speciali di oggetti).

Ricordiamo che array di JavaScript sono zero indicizzato, cioè un array con n elementi avrà chiavi di indice 0..n-1, così si vuole iterare fino a lunghezza dell'array non inclusivamente utilizzando la condizione

i < sumArray.length. Non appena questa condizione è falsa, vuoi interrompere l'iterazione perché sei in un territorio non definito.