2009-02-01 21 views
5

Dies ist etwas verwandt mit this question, aber ich frage nicht nach Ressourcen über Best Practices in JavaScript, sondern Ihre eigentliche Beratung.JavaScript Best Practices

Ich fange mit meiner eigenen Liste an. Sie können entweder eine Antwort posten oder die Frage direkt bearbeiten, wenn Sie sicher sind, dass der Rat nicht umstritten ist.

Hier gehen wir:

  • immer verwenden var
  • Namen Konstruktorfunktionen Kapital - und sonst nichts
  • Verwendung === zum Vergleich
  • Verwendung explizite Casts für Primitive, z.B. Number(), String(), Boolean()
  • Check für primitive Typen mit typeof
  • Prüfung für Objekttypen mit instanceof
  • Check für mit Object.prototype.toString() eingebauten Objekttypen Cross-Frame-Probleme zu vermeiden, z.B.

    Object.prototype.toString.call(obj) === '[object Array]' 
    
  • Scheck this in Konstruktoren, z.B.

    function MyObject() { 
        if(!(this instanceof arguments.callee)) 
         throw new Error('constructor called with invalid `this`'); 
        // [...] 
    } 
    
  • Verwendung anonyme Funktionen für Namensräume nicht den globalen Bereich verschmutzen, z.B.

    (function() { 
        var noGlobalVar = 'foo'; 
        // [...] 
    })(); 
    
  • Scheck hasOwnProperty() in for..in Schlaufen - nicht davon ausgehen, dass niemand mit den Prototypen verwirrten

  • nicht verwenden for..in Schleifen über Elemente des Arrays oder Arrays ähnliche Objekte
iterieren

Antwort

0

verwenden Sie explizite Umwandlungen für Primitive, z Number(), String(), Boolean()

Wirklich? Ich vermeide solche wie die Pest. Was denkst du darüber?

+1

mein Denken war es, Umwandlungen explizit zu machen, zB mache ich keine Dinge wie 'a = 3 + document.forms [0] .elemens [0] .value', aber' a = 3 + Number (document.forms [ 0] .elemens [0] .value) '; Beachten Sie, dass ich ** ** nicht rate, Wrapper-Objekte zu verwenden ('new Number()', 'new String()', ...) – Christoph

+0

Sie müssen das nicht tun, bis Sie erwarten, dass der Wert enthalten ist eine Zeichenfolge wie 'foo'. was in beiden Fällen scheitern wird. – scunliffe

+0

@scunliffe: '3 + 'foo' === '3foo'', während '3 + Zahl ('foo') === NaN' – Christoph

2

Nicht mit Kerntypen einmischen. Halte niemals etwas an Array.prototype - du weißt nicht, wer das sonst tut und wie solche Dinge interagieren könnten.

Nur explizite Typen prüfen, wenn es darauf ankommt. Ente tippen ist ein gutes Konzept.

Ich möchte anonyme Funktionen verwenden, um die Verschmutzung des globalen Geltungsbereichs zu vermeiden. Vor allem, wenn Sie viel mit jQuery arbeiten, wie ich, es ist wirklich hilfreich, eine Vorlage wie folgt zu verwenden:

(function($) { 
    /* Lots of code */ 
})(jQuery); 
0

Dies gilt für alle Sprachen im Allgemeinen:

Vermeiden Sie tiefe Verschachtelung, es ist nicht akzeptabel, und sehr schwer zu lesen.Es gibt einige Techniken, zum Beispiel in Schleifen können Sie eine frühe break oder continue nächste Iteration statt alles in einem if wickeln.

+0

3-4 Ebenen in JS? Klingt wie unmöglich. Manchmal hast du 4 Level bevor du überhaupt angefangen hast etwas zu schreiben. Betrachte Object.defineProperties (...) in einem closure (function() {...}()) - wenn du mit dem Schreiben beginnst, sagen wir Getter, ist sein Körper schon auf Level 4. –

+0

@ SzymonWygnański danke, dass du meinen Fehler notiert hast , diese Zahl war viel zu niedrig – ajax333221

0

immer jslint verwenden.

Es ist ein bisschen frustrierend am Anfang, aber es ist vorteilhaft.

Jslint wird Ihnen sagen, wenn Sie eine oder mehrere der "Best Practices" brechen.

Verwenden Sie auch IDE, die jslint unterstützt. Ich kann WebStorm oder Sublime Text 2 empfehlen (diese 2 habe ich selbst getestet und sie unterstützen jslint sehr gut).

+0

Ich fand, dass jshint für große Teams praktischer und weniger eigensinnig ist –