2014-09-08 17 views
26

ho il seguente codice:JavaScript Possibili iterazione su imprevisto

for (i in awards) { 
     if (awards[i] instanceof Array === false) { 
       console.log(awards[i]); 
       httpFactory.patch(awards[i], {"read": true}, false); 
      } 
     } 

mio IDE mostra questo errore relativo al codice di cui sopra:

possibile l'iterazione su (ereditate custom /) membri inaspettati, Probabilmente manca il controllo hasOwnProperty

Controlla eventuali istanze di loop for-in non filtrati in JavaScript. L'utilizzo di questo costrutto da parte di comporta l'elaborazione delle proprietà ereditate o impreviste di . È necessario filtrare le proprie proprietà con il metodo hasOwnProperty() . La convalida funziona in JavaScript, html o file jsp.

Potresti spiegare più in dettaglio cosa si intende con questa affermazione?

+2

jQuery non esegue controlli 'hasOwnProperty' - mi chiedo quanti avvertimenti che avrebbero prodotto .... – Alnitak

risposta

54

L'IDE raccomanda che si aggiunge un test:

if (awards.hasOwnProperty(i)) { 
    ... 
} 

all'interno del ciclo for.

Personalmente raccomando di non farlo e di disabilitare l'avviso se possibile. Semplicemente non c'è alcun bisogno nella maggior parte del codice, e ancor meno bisogno nel codice ES5 dove si può tranquillamente aggiungere proprietà non enumerabili a un oggetto utilizzando Object.defineProperty

Il controllo hasOwnProperty è necessaria solo se è stato non sicuro aggiunti nuovi (enumerabili) oggetti da Object.prototype, quindi la soluzione più semplice è non farlo.

jQuery non esegue questo test: sono explicitly document che jQuery si interromperà se Object.prototype non è stato modificato in modo corretto.

+3

oh, e vedere anche http://phrogz.net/death-to-hasownproperty – Alnitak

+12

In IntelliJ 15, per disabilitare l'avviso, effettuare le seguenti operazioni: Apri Preferenze -> Editor -> Stile codice -> Ispezioni. Nella casella di ricerca, inserisci "hasOwnProperty". Visualizzerà "Unfiltered for..in loop". Deseleziona quella casella. Fare clic sul pulsante OK per accettare le modifiche e chiudere la finestra. – Machtyn

+0

In IntelliJ: CTRL ALT S (a meno che tu non stia usando Ubuntu che ha la sua scorciatoia CTRL ALT S) cerca "hasOwnProperty" e avrai diritto al problema, deselezionalo ed è fatto! –

11

Ogni oggetto in javascript ha un prototipo che ha le sue proprietà (metodi/proprietà native/ereditate) e proprietà direttamente collegate all'oggetto stesso.

Quando si itera su un oggetto, itererà le proprietà dell'oggetto stesso e le proprietà del prototipo dell'oggetto.

Quindi, per evitare di ripetere il prototipo, si consiglia di utilizzare il metodo hasOwnProperty che restituisce true solo quando l'oggetto ha direttamente la proprietà menzionata. vale a dire, non dentro prototipo

Esempio

for (var k in object) { 
    if (object.hasOwnProperty(k)) { 
    // do your computation here. 
    } 
} 

Maggiori dettagli possono essere trovati here

0

si dovrebbe aggiungere una condizione più all'inizio di questo ciclo

if (awards.hasOwnProperty(i)) 
+3

Ho votato questa risposta verso il basso, quindi penso che è educato se dico perché.Questa risposta dice come evitare l'avvertimento ma non spiega cosa significa l'avvertimento, come questo lo evita o cosa fa questo codice. – WoodenKitty

0

È inoltre possibile refactoring del ciclo in:

const keys = Object.keys(object); 
for (const key of keys){ 
    // do something with object[key]; 
} 
Problemi correlati