Lassen Sie uns in diesem ersten Artikel über einige Programmierdetails von NodeJs sprechen.
1. Durchqueren Sie das Array
for (var i=0, l=arr.length; i<l; i++)
Ein Vorteil dieser Schreibweise besteht darin, dass jede Schleife einen Schritt einspart, um die Länge des Array-Objekts zu ermitteln. Je länger die Array-Länge, desto offensichtlicher ist der Wert.
2. Bestimmen Sie, ob die Variable wahr oder falsch ist
if (a) {...} //a='', a='0', a=[], a={}
Die Ergebnisse der bedingten Beurteilung sind: falsch, wahr, wahr, wahr. Dieses Ergebnis unterscheidet sich vom PHP-Ergebnis. Lassen Sie sich nicht verwirren. Es ist auch notwendig, zwischen Situationen zu unterscheiden, die Nichtidentitätsurteilen ähneln.
3. Beurteilung der Nichtidentität mit dem Wert 0
1 if (0 == '0') {...} //true 2 if (0 == []) {...} //true 3 if (0 == [0]) {...} //true 4 if (0 == {}) {...} //false 5 if (0 == null) {...} //false 6 if (0 == undefined) {...} //false
Tatsächlich gibt es viele solcher seltsamen Urteile, ich habe nur die häufigeren aufgelistet. Wenn Sie die Regeln verstehen möchten, lesen Sie bitte meinen anderen Blog-Beitrag: [JavaScript] Ausführliche Analyse der relationalen Operationen und if-Anweisungen von JavaScript.
4. Die Falle von parseInt
var n = parseInt(s); //s='010'
Nachdem diese Anweisung ausgeführt wurde, beträgt der Wert von n 8 und nicht 10. Obwohl viele Leute das wissen, sind Fehler beim Programmieren unvermeidlich, und ich weiß es sehr gut. Daher ist es am besten, so zu schreiben, dass Sie keine Fehler machen.
var n = parseInt(s, 10);
5. Variablen müssen vor der Verwendung deklariert werden
Obwohl es keinen Fehler gibt, Variablen direkt zu verwenden, ohne sie zu deklarieren, ist das Schreiben auf diese Weise sehr fehleranfällig. Da der Interpreter sie als globale Variable interpretiert, kann sie leicht denselben Namen wie andere globale Variablen haben und Fehler verursachen. Daher müssen wir eine gute Angewohnheit entwickeln, Variablen zu deklarieren, bevor wir sie verwenden.
6. Es liegt eine asynchrone Situation in der Schleife vor
for (var i=0, l=arr.length; i<l; i++) { var sql = "select * from nx_user"; db.query(sql, function(){ sys.log(i + ': ' + sql); }); //db.query为表查询操作,是异步操作 }
Sie werden feststellen, dass die Ausgabeergebnisse dieselben sind und dass sie der Ausgabeinhalt sind, wenn i = arr.length-1. Da JavaScript Single-Threaded ist, führt es zunächst den synchronen Inhalt der gesamten Schleife aus, bevor die asynchronen Vorgänge ausgeführt werden. Die anonyme Rückruffunktion im Code ist ein asynchroner Rückruf. Wenn diese Funktion ausgeführt wird, sind die for-Schleife und einige nachfolgende Synchronisierungsvorgänge abgeschlossen. Aufgrund des Abschlussprinzips behält diese Funktion den Inhalt der SQL-Variablen und der i-Variablen in der letzten Schleife der for-Schleife bei, was zu falschen Ergebnissen führt.
Was sollen wir also tun? Es gibt zwei Lösungen: Eine davon besteht darin, eine Sofortfunktion wie folgt zu verwenden:
for (var i=0, l=arr.length; i<l; i++) { var sql = "select * from nx_user"; (function(sql, i){ db.query(sql, function(){ sys.log(i + ': ' + sql); }); //db.query为表查询操作,是异步操作 })(sql, i); }
Eine andere Methode besteht darin, den asynchronen Operationsteil zu extrahieren und eine Funktion wie folgt zu schreiben:
var outputSQL = function(sql, i){ db.query(sql, function(){ sys.log(i + ': ' + sql); }); //db.query为表查询操作,是异步操作 } for (var i=0, l=arr.length; i<l; i++) { var sql = "select * from nx_user"; outputSQL(sql, i); }
7. Vermeiden Sie bei der Verarbeitung großer Datenmengen verschachtelte Schleifen.
Da die Verarbeitungszeit verschachtelter Schleifen mit zunehmender Datenmenge exponentiell zunimmt, sollte dies so weit wie möglich vermieden werden. Wenn es in diesem Fall keinen besseren Weg gibt, besteht die allgemeine Strategie darin, Raum gegen Zeit zu tauschen, also eine Hash-Mapping-Tabelle sekundärer zyklischer Daten zu erstellen. Natürlich müssen die konkreten Umstände im Einzelfall analysiert werden. Ein weiterer zu erwähnender Punkt ist, dass einige Methoden selbst ein Schleifenkörper sind, wie z. B. Array.sort() (diese Methode sollte mithilfe von zwei Schleifenebenen implementiert werden), sodass Sie bei der Verwendung darauf achten müssen.
8. Versuchen Sie, rekursive Aufrufe zu vermeiden.
Der Vorteil des rekursiven Aufrufs besteht darin, dass der Code prägnant und die Implementierung einfach ist. Die Nachteile sind jedoch sehr wichtig und werden wie folgt erläutert:
(1) Die Größe des Funktionsstapels wächst linear mit der Rekursionsebene, und der Funktionsstapel hat eine Obergrenze. Wenn die Rekursion eine bestimmte Ebene erreicht, läuft der Funktionsstapel über, was zu Programmfehlern führt
(2) Jede rekursive Ebene fügt zusätzliche Stack-Push- und Pop-Operationen hinzu, dh das Speichern der Szene und das Wiederherstellen der Szene während des Funktionsaufrufs.Daher sollten rekursive Aufrufe so weit wie möglich vermieden werden.
9. Bezüglich der Bereichsisolierung von Moduldateien.
Wenn Node die JavaScript-Moduldatei kompiliert, wurde ihr Inhalt vollständig wie folgt gepackt:
(function(exports, require, module, __filename, __dirname){ 你的JavaScript文件代码 });
(function(){ ... ... })();
Das Folgende ist ein Beispiel für einen Fehlercode:
var o = []; o['name'] = 'LiMing';
var o = []; o['name'] = 'LiMing'; var s = JSON.stringify(o);
Ursprünglich dachte er, dass das Namensattribut des Objekts o in der JSON-Zeichenfolge enthalten sein würde, aber das Ergebnis war, dass dies nicht der Fall war. Ich war damals auch sehr überrascht, aber ich hatte den Verdacht, dass es ein Problem mit der Vermischung von Arrays und Objekten war. Ich habe es ausprobiert und es stellte sich heraus, dass es das Problem war. Später habe ich in der ECMA-Spezifikation herausgefunden, dass Arrays nach JA-Regeln serialisiert werden. Daher ist es notwendig, eine gute Programmiergewohnheit zu entwickeln, Arrays und Objekte richtig zu verwenden und sie nicht zu vermischen.
11. Elegante Promise-Programmierung
Ich glaube, dass jeder, der mit nodeJs in Kontakt gekommen ist, diese Erfahrung gemacht hat. Wenn asynchrone Rückrufe in asynchronen Rückrufen verschachtelt sind, wird der Code verwirrend und unleserlich. Dieses Dilemma von NodeJs kann mit Hilfe von Versprechen überwunden werden. Versprechen ist wie ein Schnitzer, der Ihren Code elegant und schön macht. Promise hat eine A-Spezifikation und es gibt online mehrere Implementierungsmethoden, auf die Sie sich beziehen können.