2009-10-26 13 views
8

JSLint continua a lamentarsi di cose come questaWrapping Perché in loop con se le dichiarazioni in Javascript - ciclare su array

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    // BLAH 
} 

Dire che dovrei avvolgerla in un'istruzione if. Mi rendo conto che è necessario avvolgerlo se si esegue il looping sulle proprietà di un oggetto, ma qui cosa dovrei inserire nella dichiarazione if per fare il filtraggio corretto.

Inoltre quando faccio qualcosa come

for (var i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (var i =0; i < 20; i++) 
{ 
    // bar 
} 

Si lamenta che è già stato definito. Come si impedisce questo a parte l'utilizzo di nomi di variabili diversi?

risposta

9

JSLint si lamenta di un sacco che non è veramente dannoso. In questo caso è giusto lamentarsi di for...in, perché questo è il costrutto errato da ripetere su una matrice.

Questo perché otterrete non solo i tasti numerici, ma anche eventuali altre proprietà arbitrarie che sono state aggiunte all'array o al suo Array.prototype. Quest'ultimo deriva in genere dalle funzioni di utilità di estensione aggiunte dai framework.

Mentre è possibile sconfiggere il caso con hasOwnProperty per verificare che non sia un membro prototipo, è più brutto che farlo semplicemente nel modo corretto con for (var i= 0...) quindi perché preoccuparsi.

Inoltre, con for...in non sarà necessario ottenere gli articoli in ordine numerico come ci si potrebbe aspettare.

Si lamenta che sono già stato definito. Come si impedisce questo a parte l'utilizzo di nomi di variabili diversi?

Sì, puoi ignorarlo.

Vuole che si rimuova il var dal secondo for (i..., perché dichiarare una variabile due volte nello stesso ambito non fa nulla. Comunque raccomando di lasciare lo var lì perché non fa alcun danno, e se muovi il loop su un altro blocco non vuoi che sia improvvisamente scarabocchiato sui globals.

8

In realtà, non è necessario ascoltare jslint. Ma se si vuole veramente passare solo (che è bello) si potrebbe fare:

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    if (myArray.hasOwnProperty(value)) { 
    // BLAH 
    } 
} 

Per la seconda parte, hai di metterli in funzione o utilizzare diverse variabili. L'altra soluzione sarebbe semplicemente usare i invece di var i la seconda volta, perché è già definito ...

4

Se osservate i documenti JSLint, troverete un collegamento che spiega the rationale behind filtering for-in loops: in sostanza, è per evitare di inciampare su tutte le proprietà enumerabili che sono state aggiunte al prototipo dell'oggetto. (Sebbene non si debba usare for-in per iterare comunque su un array.)

Nel secondo caso si dichiara la variabile due volte: le variabili hanno scope di funzione (o ambito globale) in JavaScript.Douglas Crockford, e quindi JSLint, sostiene che è meglio dichiarare la variabile solo una volta per l'ambito in cui si trova:

var i; 

for (i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (i =0; i < 20; i++) 
{ 
    // bar 
} 
0

suggerisco di seguire JSLint come buon punto di riferimento, si consiglia di configurare alcune opzioni e farti controllare perdente.

Comunque il miglior modo per scorrere un array utilizza per ciclo anziché cui ciclo.

Se si desidera una spiegazione dettagliata leggere questo post