In diesem ersten Artikel wird über einige Programmierdetails von NodeJS gesprochen.
1. durch das Array iterieren
für (var i = 0, l = arr.length; i <l; i ++)
Ein Vorteil des Schreibens auf diese Weise besteht darin, die Länge des Array -Objekts in jeder Schleife um einen Schritt weniger zu erreichen. Je länger die Arraylänge, desto offensichtlicher der Wert.
2. Bestimmen Sie die Authentizität von Variablen
if (a) {...} // a = '', a = '0', a = [], a = {}Die Ergebnisse von If bedingter Beurteilung sind: falsch, wahr, wahr, wahr. Dieses Ergebnis unterscheidet sich vom Ergebnis von PHP. Seien Sie also nicht verwirrt. Es ist auch notwendig, zwischen Situationen zu unterscheiden, in denen es nicht Identitätsurteilen ähnelt.
3.. Nicht-Identitäts-Urteil über 0 Wert
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {{}) {...} // false5 if (0 == null) {{} // false6 if (0 == und und (0 ==) und und und und und und undco) {... ... {} // false6 if (0 == und und und und und, und und) {... ... {...} // false6 if (0 ==) und und und und und undcoer, und nichtTatsächlich gibt es viele so seltsame Urteile, und ich habe nur die häufigeren aufgeführt. Wenn Sie die Regeln verstehen möchten, lesen Sie bitte einen anderen Blog-Beitrag von My: [JavaScript] Eingehende Analyse der relationalen Operationen von JavaScript und wenn Anweisungen.
4. Die Falle von Parseint
var n = parsesint (s); // s = '010'
Nachdem die Aussage ausgeführt wurde, beträgt der N -Wert 8, nicht 10. Obwohl viele Menschen dies wissen, ist es unvermeidlich, dass es Fehler in der Programmierung geben wird, und ich habe ein tiefes Verständnis dafür. Daher ist es am besten, auf folgende Weise zu schreiben, sodass es keine Fehler geben wird.
var n = parsesint (s, 10);
5. Muss Variablen vor der Verwendung deklarieren
Obwohl es keine Fehler macht, die Variablen verwenden, ohne sie zu deklarieren, ist es einfach, Fehler beim Schreiben auf diese Weise zu machen. Da der Dolmetscher es als globale Variable interpretiert, ist es einfach, Fehler zu verursachen, indem es sie mit anderen globalen Variablen aufteilt. Daher müssen Sie die gute Angewohnheit entwickeln, Variablen zu deklarieren, bevor Sie sie verwenden.
6. In der Schleife befindet sich Asynchronisation
für (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * aus nx_user"; db.query (SQL, function () {sys.log (i + ':' + sql);}); //db.Query ist ein Tischabfragevorgang, der eine asynchrone Operation ist}Sie werden feststellen, dass die Ausgabergebnisse gleich sind und der Ausgangsinhalt sind, wenn i = arr.Length-1. Da JavaScript Single-Threaded ist, wird der synchrone Inhalt der vollständigen Schleife ausgeführt, bevor die asynchronen Operationen durchgeführt werden. Die anonyme Rückruffunktion im Code ist ein asynchroner Rückruf. Wenn die Funktion ausgeführt wird, wurden die für Schleifen und einige nachfolgenden Synchronisationsvorgänge ausgeführt. Aufgrund des Schließungsprinzips behält diese Funktion den Inhalt der SQL -Variablen und die I -Variable der letzten Schleife der For -Loop bei, was zu einem falschen Ergebnis führt.
Also, was soll ich tun? Es gibt zwei Lösungen, eine besteht darin, die sofortige Funktion wie folgt zu verwenden:
für (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * aus nx_user"; (Funktion (SQL, i) {db.Query (SQL, Funktion () {sys.log (i + ':' + sql);}); //db.query ist eine Tabelle -Abfrageoperation, die ein asynchroner Betrieb}) (SQL, I);} istEine andere Methode besteht darin, den asynchronen Betriebsteil zu extrahieren und wie folgt eine einzelne Funktion zu schreiben:
var OutputSQL = Funktion (SQL, i) {db.Query (SQL, Funktion () {sys.log (i + ':' + sql);}); //db.Query ist eine Tabelle -Abfrageoperation, die eine asynchrone Operation für (var i = 0, l = arr.length; i <l; i ++) {var sql = "aus nx_user" ist; outputSQL (SQL, I); }7. Versuchen Sie bei der Verarbeitung großer Datenmengen, um eine Schleifennistung zu vermeiden.
Da die Verarbeitungszeit der Schleifennistung mit der Erhöhung der Datenmenge exponentiell zunimmt, sollte sie so weit wie möglich vermieden werden. In diesem Fall besteht die allgemeine Strategie darin, den Raum für die Zeit auszutauschen, dh eine Hash -Mapping -Tabelle mit sekundären zyklischen Daten auszutauschen. Natürlich ist auch eine spezifische Situationsanalyse erforderlich. Eine andere Sache zu sagen ist, dass einige Methoden selbst Schleifenkörper wie Array.Sort () sind (diese Methode sollte mit zwei Schleifenschichten implementiert werden), sodass Sie bei der Verwendung aufmerksam sind.
8. Versuchen Sie, rekursive Anrufe zu vermeiden.
Der Vorteil von rekursiven Aufrufen besteht darin, dass der Code präzise und die Implementierung einfach ist, während seine Nachteile sehr wichtig sind. Die folgende Beschreibung lautet wie folgt:
(1) Die Größe des Funktionsstapels wächst linear mit der rekursiven Ebene und der Funktionsstapel hat einen Obergrenzewert. Wenn die Rekursive eine bestimmte Anzahl von Schichten erreicht, überflutet der Funktionsstapel, was zu Programmfehlern führt.
(2) Jede rekursive Schicht fügt zusätzliche Stack -Press- und Stapel -Release -Vorgänge hinzu, dh die Speicherstelle und Wiederherstellungsstelle während des Funktionsaufrufs.
Daher sollten rekursive Anrufe so weit wie möglich vermieden werden.
9. In Bezug auf die Umfangsisolierung von Moduldateien.
Wenn der Knoten JavaScript -Moduldateien kompiliert, wurde der Inhalt am Anfang und am Ende wie folgt verpackt:
(Funktion (exportiert, erfordern, modul, __FileName, __DIRNAME) {Ihr JavaScript -Dateicode});Dies ermöglicht die Isolation der Bereiche zwischen jeder Moduldatei. Wenn Sie also NodeJS -Moduldateien schreiben, müssen Sie daher keine weitere Ebene der Abzweigungsverkapselung hinzufügen. Beispielsweise fügt das folgende Codeformat nur eine zusätzliche Funktionsebene hinzu, die nicht empfohlen wird:
(function () {...…}) ();10. Mischen Sie keine Arrays und Objekte
Hier ist ein Beispiel für den Fehlercode:
var o = []; o ['name'] = 'liming';
Gemischte Arrays und Objekte können zu unvorhersehbaren Fehlern führen. Ein Kollege von mir stieß auf ein sehr seltsames Problem. Schauen wir uns zuerst den Code an:
var o = []; o ['name'] = 'liming'; var s = json.Stringify (o);
Er dachte, dass das Namensattribut von Objekt O in der JSON -Zeichenfolge sein würde, aber das Ergebnis war nichts. Ich war damals auch sehr seltsam, aber ich hatte eine Vorahnung, dass es ein Problem beim Mischen von Arrays und Objekten war. Ich habe es versucht und es war in der Tat sein Problem. Später fand ich in der ECMA -Spezifikation, dass Arrays gemäß den JA -Regeln serialisiert werden. Daher müssen Sie eine gute Programmiergewohnheit entwickeln, Arrays und Objekte korrekt verwenden und sie nicht mischen.
11. Versprechen Sie elegante Programmierung
Ich glaube, dass Menschen, die NodeJs ausgesetzt waren, diese Erfahrung gemacht haben. Wenn der asynchrone Rückruf im asynchronen Rückruf verschachtelt ist, erscheint der Code sehr verwirrend und es fehlt die Lesbarkeit. Dieses Dilemma von NodeJs kann mit Versprechen überwunden werden. Versprechen ist wie ein Bildhauertool, das Ihren Code elegant und schön macht. Es gibt eine A+ -Schicht für Versprechen, und es gibt mehrere Implementierungsmethoden online, Sie können sich darauf verweisen.