Este primer artículo hablará sobre algunos detalles de programación de NodeJs.
1. Iterar a través de la matriz
para (var i = 0, l = arr.length; i <l; i ++)
Una ventaja de escribir de esta manera es obtener la operación de obtener la longitud del objeto de matriz mediante un paso menos en cada bucle. Cuanto más larga sea la longitud de la matriz, más obvio es el valor.
2. Determinar la autenticidad de las variables
if (a) {...} // a = '', a = '0', a = [], a = {}Los resultados del juicio if condicional son: falso, verdadero, verdadero, verdadero. Este resultado es diferente del resultado de PHP, así que no se confunda. También es necesario distinguir entre situaciones en las que es similar a los juicios que no son de identidad.
3. Juicio de no identidad de valor de 0
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // falso if (0 == null) {...} // falso 6 if (0 == Únete) {...} // falsoDe hecho, hay muchos juicios de esas extraños, y solo enumeré los más comunes. Si desea comprender las reglas, consulte otra publicación de blog de mi: [JavaScript] Análisis en profundidad de las operaciones relacionales de JavaScript y las declaraciones IF.
4. La trampa de Parseint
var n = parseint (s); // s = '010'
Después de ejecutar la declaración, el valor n es 8, no 10. Aunque muchas personas lo saben, es inevitable que haya errores en la programación, y lo comprendí profundamente. Por lo tanto, es mejor escribir de la siguiente manera, por lo que no habrá errores.
var n = parseint (s, 10);
5. Debe declarar variables antes de usar
Aunque no cometerá ningún error directamente usando variables sin declararlas, es fácil cometer errores al escribir de esta manera. Debido a que el intérprete lo interpreta como una variable global, es fácil causar errores dividiéndolo con otras variables globales. Por lo tanto, debe desarrollar el buen hábito de declarar variables antes de usarlas.
6. Hay asíncrono en el bucle
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * de nx_user"; db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.Query es una operación de consulta de tabla, que es una operación asíncrona}Encontrará que los resultados de la salida son los mismos y son el contenido de salida cuando i = arr.length-1. Debido a que JavaScript es un solo hilo, ejecutará el contenido sincrónico del bucle completo antes de realizar las operaciones asíncronas. La función anónima de devolución de llamada en el código es una devolución de llamada asincrónica. Cuando se ejecuta la función, se han ejecutado el bucle for bucle y algunas operaciones de sincronización posteriores. Debido al principio de cierre, esta función retendrá el contenido de la variable SQL y la variable I del último bucle del bucle for, lo que conducirá a un resultado incorrecto.
Entonces, ¿qué debo hacer? Hay dos soluciones, una es usar la función inmediata, de la siguiente manera:
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * de nx_user"; (function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.Query es una operación de consulta de tabla, que es una operación asincrónica}) (Sql, i);}Otro método es extraer la parte de operación asincrónica y escribir una sola función, de la siguiente manera:
var outedSql = function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.Query es una operación de consulta de tabla, que es una operación asíncrona} para (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * de nx_user"; outputSQL (SQL, I); }7. Al procesar grandes cantidades de datos, intente evitar el anidación de bucle.
Debido a que el tiempo de procesamiento de la anidación de bucle aumentará exponencialmente con el aumento de la cantidad de datos, debe evitarse tanto como sea posible. En este caso, si no hay mejor manera, la estrategia general es intercambiar espacio por el tiempo, es decir, establecer una tabla de mapeo hash de datos cíclicos secundarios. Por supuesto, también se requiere un análisis de situación específico. Otra cosa que decir es que algunos métodos son cuerpos de bucle en sí, como Array.sort () (este método debe implementarse con dos capas de bucles), por lo que debe prestar atención al usarlo.
8. Trate de evitar llamadas recursivas.
La ventaja de las llamadas recursivas es que el código es conciso y la implementación es simple, mientras que sus desventajas son muy importantes. La siguiente descripción es la siguiente:
(1) El tamaño de la pila de funciones crecerá linealmente con el nivel recursivo, y la pila de funciones tiene un valor límite superior. Cuando el recursivo alcanza un cierto número de capas, la pila de funciones se desborda, lo que resulta en errores del programa;
(2) Cada capa recursiva agregará operaciones adicionales de presión y liberación de pila, es decir, el sitio de guardado y el sitio de recuperación durante la llamada de función.
Por lo tanto, las llamadas recursivas deben evitarse tanto como sea posible.
9. Con respecto al alcance de aislamiento de archivos de módulos.
Cuando Node compila archivos del módulo JavaScript, su contenido se ha envuelto al principio y al final, como sigue:
(función (exporta, requerir, módulo, __filename, __Dirname) {su código de archivo JavaScript});Esto permite el aislamiento del alcance entre cada archivo del módulo. Por lo tanto, cuando escribe archivos del módulo NodeJS, no necesita agregar otra capa de encapsulación de aislamiento de alcance. Por ejemplo, el siguiente formato de código solo agregará una capa adicional de llamadas de función, que no se recomienda:
(función(){ ... …})();10. No mezcle matrices y objetos
Aquí hay un ejemplo del código de error:
var o = []; o ['nombre'] = 'liming';
Las matrices y objetos mixtos pueden conducir a errores impredecibles. Un colega mío encontró un problema muy extraño. Veamos primero el código:
var o = []; o ['name'] = 'liming'; var s = json.stringify (o);
Pensó que el atributo de nombre de Object O estaría en la cadena JSON, pero el resultado no fue nada. También era muy extraño en ese momento, pero tenía una premonición de que era un problema de mezclar matrices y objetos. Lo intenté y de hecho era su problema. Más tarde encontré en la especificación ECMA que las matrices se serializan de acuerdo con las reglas de JA. Por lo tanto, debe desarrollar un buen hábito de programación, usar matrices y objetos correctamente, y no mezclarlos.
11. Promesa de programación elegante
Creo que las personas que han estado expuestas a NodeJs han tenido esta experiencia. Cuando la devolución de llamada asincrónica se anida en la devolución de llamada asincrónica, el código parece muy confuso y carece de facilidad de legibilidad. Este dilema de NodeJS puede superarse con las promesas. Promise es como una herramienta de escultura que hace que su código sea elegante y hermoso. Hay una especificación A+ para promesas, y hay varios métodos de implementación en línea, puede consultarlo.