2010-11-12 7 views
26

Sto utilizzando lo strumento JSLint per garantire che il mio JavaScript sia "strict".JavaScript: errore JSLint "Il corpo di un for in deve essere racchiuso in un'istruzione if per filtrare le proprietà indesiderate dal prototipo"

sto ricevendo il seguente errore, ma non capisco come risolvere il problema:

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype 

Per il seguente codice:

for (var i in keypairs) { 
    ... 
} 

Qualcuno ha qualche idea come risolvere questo a quello è JavaScript "strict" e non verrà contrassegnato da JSLint

risposta

15

Vuole che tu usi hasOwnProperty.

Come gran parte di JSLint, questa è una raccomandazione e la sua applicabilità dipende dalla situazione. È utile se ci sono proprietà enumerable indesiderate nel prototipo dell'oggetto. Questo potrebbe essere il caso se per es. utilizzare determinate librerie JavaScript.

5

Il problema con for...in è che si attraverseranno anche le proprietà del prototipo e il più delle volte questo non è ciò che si desidera. Ecco perché è necessario verificare la proprietà con hasOwnProperty:

for (var i in keypairs) { 
    if(keypairs.hasOwnProperty(i) { 
     //... 
    } 
} 
3
for (var i in keypairs) { 
    if (keypairs.hasOwnProperty(i)) { 
     ... 
    } 
} 

Questo perché il ciclo for/in può iterare su un metodo esteso dalla libreria 3rd party, per esempio se c'è un

Object.prototype.clone = function() { ... } 

quindi senza la condizione .hasOwnProperty(), il metodo .clone verrà ripetuta nel ... pure.

Questo è ulteriormente spiegato in http://yuiblog.com/blog/2006/09/26/for-in-intrigue/, collegato dalla pagina JSLint stessa.

È possibile disattivare questo avviso selezionando "Tollerare unfiltered for in".

36

Se keypairs è un array, allora si dovrebbe davvero iterazioni su elementi quali:

for(var i = 0; i < keypairs.length; i++) { 
    ... 
} 

Se keypairs è un hash, poi JSLint sia correttamente raccomanda di verificare che si sta operando sul tipo di chiave appropriata (vale a dire, confermando che l'hash è del tipo previsto)

così qualcosa come

for(var i in keypairs) { 
    if(keypairs.hasOwnProperty(i)) { 
    ... 
    } 
} 

dove il caso è va la chiusura di qualsiasi criterio garantisce che non si stia accedendo a una funzione prototipo, ecc.

+6

+1, solo una nota: meglio modello per l'iterazione dell'array è 'for (var i = 0, l = keypairs.length; i

0

un'occhiata alla propria documentazione di JSLint: http://www.jslint.com/lint.html salto fino alla sezione

per in

fanno il seguente: for (name in object) { if (object.hasOwnProperty(name)) { .... } }

Problemi correlati