Ce premier article parlera de certains détails de programmation de NodeJS.
1. Itérer dans le tableau
pour (var i = 0, l = arr.length; i <l; i ++)
Un avantage de l'écriture de cette façon est d'obtenir le fonctionnement de l'obtention de la longueur de l'objet de tableau d'une étape de moins dans chaque boucle. Plus la longueur du tableau est longue, plus la valeur est évidente.
2. Déterminer l'authenticité des variables
if (a) {...} // a = '', a = '0', a = [], a = {}Les résultats du jugement conditionnel sont: faux, vrai, vrai, vrai. Ce résultat est différent du résultat de PHP, alors ne soyez pas confus. Il est également nécessaire de faire la distinction entre les situations où elle est similaire aux jugements de non-identité.
3. Jugement non identifiable de 0 valeur
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // false5 if (0 == null) {...} // false6 if (0 == Undefined) {...} // false)En fait, il existe de nombreux jugements étranges, et je n'ai énuméré que les plus courants. Si vous souhaitez comprendre les règles, veuillez vous référer à un autre article de blog de mes: [JavaScript] Analyse approfondie des opérations relationnelles de JavaScript et des instructions.
4. Le piège de Parseint
var n = parseInt (s); // s = '010'
Une fois la déclaration exécutée, la valeur n est de 8, pas 10. Bien que beaucoup de gens le savent, il est inévitable qu'il y aura des erreurs dans la programmation, et j'en ai une compréhension approfondie. Par conséquent, il est préférable d'écrire de la manière suivante, donc il n'y aura pas d'erreurs.
var n = parseInt (s, 10);
5. doit déclarer des variables avant utilisation
Bien que cela ne fera pas d'erreurs directement en utilisant des variables sans les déclarer, il est facile de faire des erreurs lors de l'écriture de cette manière. Parce que l'interprète l'interprète comme une variable globale, il est facile de provoquer des erreurs en la divisant avec d'autres variables globales. Par conséquent, vous devez développer la bonne habitude de déclarer des variables avant de les utiliser.
6. Il y a de l'async dans la boucle
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 est une opération de requête de table, qui est une opération asynchrone}Vous constaterez que les résultats de sortie sont les mêmes et sont le contenu de sortie lorsque i = arr.length-1. Parce que JavaScript est unique, il exécutera le contenu synchrone de la boucle complète avant d'effectuer les opérations asynchrones. La fonction de rappel anonyme dans le code est un rappel asynchrone. Lorsque la fonction est exécutée, la boucle FOR et certaines opérations de synchronisation ultérieures ont été exécutées. En raison du principe de fermeture, cette fonction conservera le contenu de la variable SQL et la variable I de la dernière boucle de la boucle FOR, ce qui conduira à un résultat incorrect.
Alors que dois-je faire? Il y a deux solutions, l'une consiste à utiliser la fonction immédiate, comme suit:
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * from nx_user"; (fonction (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query est une opération de requête de table, qui est une opération asynchrone}) (sql, i);};Une autre méthode consiste à extraire la pièce de fonctionnement asynchrone et à écrire une seule fonction, comme suit:
var ouvertsql = fonction (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.Query est une opération de requête de table, qui est une opération asynchrone} pour (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * from nx_user"; outputSQL (SQL, I); }7. Lors du traitement de grandes quantités de données, essayez d'éviter la nidification de boucle.
Étant donné que le temps de traitement de la nidification de boucle augmentera de façon exponentielle avec l'augmentation de la quantité de données, elle doit être évité autant que possible. Dans ce cas, s'il n'y a pas de meilleur moyen, la stratégie générale consiste à échanger un espace contre le temps, c'est-à-dire pour établir un tableau de cartographie de hachage des données cycliques secondaires. Bien sûr, une analyse de la situation spécifique est également requise. Une autre chose à dire est que certaines méthodes sont elles-mêmes des corps de boucle, comme Array.Sort () (cette méthode doit être mise en œuvre avec deux couches de boucles), vous devez donc faire attention lorsque vous l'utilisez.
8. Essayez d'éviter les appels récursifs.
L'avantage des appels récursifs est que le code est concis et que l'implémentation est simple, tandis que ses inconvénients sont très importants. La description suivante est la suivante:
(1) La taille de la pile de fonction augmentera linéairement avec le niveau récursif, et la pile de fonction a une valeur limite supérieure. Lorsque le récursif atteint un certain nombre de couches, la pile de fonction débordera, entraînant des erreurs de programme;
(2) Chaque couche récursive ajoutera des opérations supplémentaires sur la suppression de la pile et de la pile, c'est-à-dire le site d'enregistrement et le site de récupération pendant l'appel de fonction.
Par conséquent, les appels récursifs doivent être évités autant que possible.
9. Concernant l'isolement de portée des fichiers de modules.
Lorsque le nœud compile des fichiers de modules JavaScript, son contenu a été enveloppé au début et à la fin, comme suit:
(fonction (exportations, requis, module, __FileName, __dirName) {votre code de fichier JavaScript});Cela permet l'isolement de portée entre chaque fichier de module. Par conséquent, lorsque vous écrivez des fichiers de module NodeJS, vous n'avez pas besoin d'ajouter une autre couche d'isolement de portée. Par exemple, le format de code suivant ajoutera seulement une couche supplémentaire d'appels de fonction, qui n'est pas recommandée:
(fonction(){ ... …})();10. Ne mélangez pas les tableaux et les objets
Voici un exemple du code d'erreur:
var o = []; o ['name'] = 'liming';
Des tableaux et des objets mixtes peuvent entraîner des erreurs imprévisibles. Un de mes collègues a rencontré un problème très étrange. Regardons d'abord le code:
var o = []; o ['name'] = 'liming'; var s = json.stringify (o);
Il pensait que l'attribut de nom de l'objet O serait dans la chaîne JSON, mais le résultat n'était rien. J'étais aussi très étrange à l'époque, mais j'avais une prémonition que c'était un problème de mélange des tableaux et des objets. Je l'ai essayé et c'était en effet son problème. Plus tard, j'ai trouvé dans la spécification ECMA que les tableaux sont sérialisés selon les règles JA. Par conséquent, vous devez développer une bonne habitude de programmation, utiliser correctement les tableaux et les objets et ne pas les mélanger.
11. Promesse de programmation élégante
Je crois que les gens qui ont été exposés à Nodejs ont eu cette expérience. Lorsque le rappel asynchrone est imbriqué dans le rappel asynchrone, le code semble très déroutant et manque de facilité de lisibilité. Ce dilemme de Nodejs peut être surmonté par des promesses. La promesse est comme un outil de sculpture qui rend votre code élégant et beau. Il existe une spécification A + pour les promesses, et il existe plusieurs méthodes d'implémentation en ligne, vous pouvez vous y référer.