2009-10-26 14 views
8

JSLint halten wie diese über Dinge beschwerenWrapping Für in Schleifen mit if-Anweisungen in Javascript - Schleifen über Arrays

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

Zu sagen, dass ich es in einer if-Anweisung wickeln sollte. Ich weiß, dass Sie es umschlingen müssen, wenn Sie die Eigenschaften eines Objekts durchlaufen, aber was soll ich in die if-Anweisung schreiben, um die richtige Filterung durchzuführen?

Außerdem, wenn ich etwas tun wie

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

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

Es beschwert sich, dass ich bereits definiert wurde. Wie verhindere ich dies anders als die Verwendung unterschiedlicher Variablennamen?

Antwort

9

JSLint whines über eine Menge, die nicht wirklich schädlich ist. In diesem Fall ist es richtig, sich über for...in zu beschweren, weil das das falsche Konstrukt ist, um ein Array zu durchlaufen.

Dies liegt daran, dass Sie nicht nur die numerischen Schlüssel erhalten, sondern auch beliebige andere Eigenschaften, die dem Array oder seinem Array.prototype hinzugefügt wurden. Letzteres stammt in der Regel aus Funktionen des Erweiterungsdienstprogramms, die von Frameworks hinzugefügt werden.

Während Sie diesen Fall mit hasOwnProperty besiegen können, um zu überprüfen, dass es kein Prototypmitglied ist, ist es hässlicher, als nur es richtig mit for (var i= 0...) zu tun, also warum stören.

Auch mit for...in werden Sie nicht unbedingt die Elemente in der numerischen Reihenfolge erhalten, wie Sie vielleicht erwarten.

Es beschwert sich, dass ich bereits definiert wurde. Wie verhindere ich dies anders als die Verwendung unterschiedlicher Variablennamen?

Ja, Sie können das ignorieren.

Es möchte, dass Sie die var aus der zweiten for (i... entfernen, da eine Variable zweimal im gleichen Umfang deklariert nichts tun. Ich würde jedoch empfehlen, die var da zu lassen, weil es keinen Schaden verursacht, und wenn Sie die Schleife zu einem anderen Block verschieben, wollen Sie nicht, dass es plötzlich auf Globals kritzelt.

8

Wirklich, Sie müssen jslint nicht hören. Aber wenn Sie wirklich wollen, passieren nur (das ist schön) Sie tun könnte:

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

Für den zweiten Teil, entweder Sie haben sie in Funktionen setzen oder verschiedene Variablen verwenden. Die andere Lösung wäre, einfach i anstelle von var i das zweite Mal zu verwenden, weil es bereits definiert ist ...

4

Wenn Sie sich die JSLint-Dokumentation ansehen, finden Sie einen Link, der erklärt the rationale behind filtering for-in loops: im Grunde ist es zu vermeiden, stolpern über alle aufzählbaren Eigenschaften, die dem Prototyp des Objekts hinzugefügt wurden. (Obwohl Sie for-in sowieso nicht verwenden sollten, um über ein Array zu iterieren.)

Im zweiten Fall deklarieren Sie die Variable zweimal: Variablen haben Funktionsumfang (oder globalen Bereich) in JavaScript.Douglas Crockford, und deshalb JSLint, argumentiert, dass es besser ist, die Variable nur einmal für den Geltungsbereich zu erklären, in dem er sich befindet:

var i; 

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

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

Ich schlage vor, JSLint als guter Anhaltspunkt zu folgen, Sie einige Optionen konfigurieren möchten und lass dich lockerer prüfen.

Wie auch immer der beste Weg, durch ein Array iterieren verwendet für Schleife statt in Schleife.

Wenn Sie eine detaillierte Erklärung wünschen, lesen Sie diese post