2016-02-18 11 views
5

Sto provando a creare un array ai fini dell'elenco in Ionic Framework e controllare tutto il primo char del nome callcenter per aggiungerli in un array di alfabeto.La manipolazione delle liste porta al ciclo infinito

for (var i = 0; i < callcenterList.length; i++) { 
    var value = callcenterList[i]._owner && callcenterList[i]._owner.company.name[0]; 

    if ((alphabet.indexOf(value) == -1 && isNaN(parseInt(value))) || 
     (isNaN(alphabet[0]) && !isNaN(value))) { 
     if(!isNaN(value)) 
     value = 123; 

     alphabet.push(value); 

     callcenterList.splice(i, 0, { 
     divider: { 
      alphabet: value 
     } 
     }); 
    } 
    }; 

Sostituzione value = 123 con value = '#' provoca Google Chrome e Google Chrome Canary malfunzionamenti e subito utilizzare fino al 100% di RAM in Mac.

Si tratta di un errore Javascript o è collegato a Google Chrome stesso?

+0

Mai sentito parlare di quello prima ... – durbnpoisn

+0

Fa differenza se si usano le virgolette anziché singole? –

+1

Beh, se è #, allora non fa parte dell'alfabeto, e non è un numero, e dal momento che limiti il ​​tuo loop basato su callcenterList.length (e spingo dentro il ciclo) non penso che debba fare né con il # e nessuno dei due con il cromo? :) – Icepickle

risposta

6

Questo non è un bug nel tuo browser o altro: stai solo creando una condizione in cui il tuo codice entra in un ciclo infinito, che tende sempre a bloccare il browser. Puoi fare la stessa cosa con un semplice ciclo while (true) {}.

In particolare, si sta iterando su callcenterList e in qualsiasi momento isNaN(alphabet[0]), si sta giuntando un nuovo elemento in callcenterList. alphabet[0] sta per avere il primo valore che si spinge lì che, nel condizionale che si sta guardando, si andrà a '#'.

Pertanto, isNaN(alphabet[0]) sarà sempre vero.

Pertanto, continuerai ad aggiungere valori in callcenterList.

Pertanto i < callcenterList.length sarà sempre vero.

+0

Questo è un ciclo semplice. E non c'è nessuna condizione che possa creare un ciclo infinito. Anche se la condizione "se" sembra essere sbagliata, il ciclo for dovrebbe continuare a scorrere. Cosa sto sbagliando in questa situazione? – Yagiz

+1

@ Yagiz Si ​​sta aggiungendo un elemento all'array iterating all'interno del ciclo con 'splice'. Dato che questo viene fatto ogni volta, 'i' non raggiungerà mai la lunghezza dell'array. –

+0

@ Yagiz: ho aggiunto una spiegazione più dettagliata alla mia risposta. Fondamentalmente, ciò che E_net4 ha detto: stai aumentando la lunghezza della tua matrice con ogni iterazione, quindi non raggiungerai mai la fine di essa. – StriplingWarrior

1

Dal momento che è difficile credere che la lunghezza è rivalutato, ecco un semplice esempio di quali problemi si potrebbe ottenere

Senza l'istruzione break, il codice verrà eseguito in un ciclo infinito. (Controllare il log della console per quanto tempo la lista potrebbe essere)

var list = [0,1,2,3]; 
 

 
for (var i = 0; i < list.length; i++) { 
 
    list.push(i); 
 
    if (i > 1000) { 
 
    break; 
 
    } 
 
} 
 

 
console.log(list.length);

Il codice fa esattamente la stessa cosa, tranne che la funzione della giuntura aggiungerà il nuovo elemento nella posizione specifica della vostra lista (nl, il tuo indice). Alla fine, aumenterà ancora la lunghezza e il tuo elenco sarà più lungo