Este primeiro artigo falará sobre alguns detalhes de programação do NodeJS.
1. Itera através da matriz
for (var i = 0, l = arr.length; i <l; i ++)
Uma vantagem de escrever dessa maneira é obter a operação de obter a duração do objeto da matriz em uma etapa a menos em cada loop. Quanto mais tempo o comprimento da matriz, mais óbvio é o valor.
2. Determine a autenticidade das variáveis
if (a) {...} // a = '', a = '0', a = [], a = {}Os resultados de se o julgamento condicional são: Falso, verdadeiro, verdadeiro, verdadeiro. Esse resultado é diferente do resultado do PHP, portanto, não fique confuso. Também é necessário distinguir entre situações em que é semelhante aos julgamentos não de identidade.
3. Julgamento não identificário do valor 0
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // false5 if (0 == null) {...} // false6 se (...} //De fato, existem muitos julgamentos estranhos, e eu listei apenas os mais comuns. Se você deseja entender as regras, consulte outra postagem do meu blog: [JavaScript] Análise detalhada das operações relacionais do JavaScript e declarações se.
4. A armadilha do parseint
var n = parseint (s); // s = '010'
Depois que a declaração é executada, o valor n é 8, não 10. Embora muitas pessoas saibam disso, é inevitável que haja erros na programação e eu tenho um profundo entendimento disso. Portanto, é melhor escrever da seguinte maneira, para que não haja erros.
var n = parseint (s, 10);
5. Deve declarar variáveis antes de usar
Embora não cometer erros diretamente usando variáveis sem declará -las, é fácil cometer erros ao escrever dessa maneira. Como o intérprete o interpreta como uma variável global, é fácil causar erros dividindo -o com outras variáveis globais. Portanto, você deve desenvolver o bom hábito de declarar variáveis antes de usá -las.
6. Há assíncrono no loop
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "selecione * de nx_user"; db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.query é uma operação de consulta de tabela, que é uma operação assíncrona}Você descobrirá que os resultados da saída são os mesmos e são o conteúdo de saída quando i = arr.length-1. Como o JavaScript é um thread único, ele executará o conteúdo síncrono do loop completo antes de executar as operações assíncronas. A função anônima de retorno de chamada no código é um retorno de chamada assíncrona. Quando a função é executada, o loop for e algumas operações subsequentes de sincronização foram executadas. Devido ao princípio de fechamento, essa função reterá o conteúdo da variável SQL e a variável I do último loop do loop for, o que levará a um resultado incorreto.
Então, o que devo fazer? Existem duas soluções, uma é usar a função imediata, como segue:
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "selecione * de nx_user"; (function (sql, i) {db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.Query é uma operação de consulta de tabela, que é uma operação assíncrona}) (sql, i);}Outro método é extrair a parte da operação assíncrona e escrever uma única função, como segue:
var outputSql = function (sql, i) {db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.Query é uma operação de consulta de tabela, que é uma operação assíncrona} para (var i = 0, l = arr.length; i <l; i ++) {var sql = "selecione * de nx_user"; outputSQL (SQL, I); }7. Ao processar grandes quantidades de dados, tente evitar o ninho de loop.
Como o tempo de processamento do ninho de loop aumentará exponencialmente com o aumento da quantidade de dados, ele deve ser evitado o máximo possível. Nesse caso, se não houver uma maneira melhor, a estratégia geral é trocar espaço pelo tempo, ou seja, estabelecer uma tabela de mapeamento de hash de dados cíclicos secundários. Obviamente, também é necessária análise de situação específica. Outra coisa a dizer é que alguns métodos são os próprios corpos do loop, como o Array.sort () (esse método deve ser implementado com duas camadas de loops), portanto, você precisa prestar atenção ao usá -lo.
8. Tente evitar chamadas recursivas.
A vantagem de chamadas recursivas é que o código é conciso e a implementação é simples, enquanto suas desvantagens são muito importantes. A descrição a seguir é a seguinte:
(1) O tamanho da pilha de funções crescerá linearmente com o nível recursivo e a pilha de funções tem um valor limite superior. Quando o recursivo atingir um certo número de camadas, a pilha de funções transborda, resultando em erros do programa;
(2) Cada camada recursiva adicionará operações adicionais de pressionamento de pilha e liberação da pilha, ou seja, o site de economia e o site de recuperação durante a chamada de função.
Portanto, chamadas recursivas devem ser evitadas o máximo possível.
9. Em relação ao isolamento do escopo dos arquivos do módulo.
Quando o Node compila arquivos de módulo JavaScript, seu conteúdo foi envolvido no início e no final, como segue:
(função (exporta, requer, módulo, __filename, __dirName) {seu código de arquivo JavaScript});Isso permite o isolamento do escopo entre cada arquivo do módulo. Portanto, quando você escreve arquivos do módulo NodeJS, não precisa adicionar outra camada de encapsulamento de isolamento de escopo. Por exemplo, o seguinte formato de código adicionará apenas uma camada adicional de chamadas de função, que não é recomendada:
(function () {... ...}) ();10. Não misture matrizes e objetos
Aqui está um exemplo do código de erro:
var o = []; o ['nome'] = 'liming';
Matrizes e objetos mistos podem levar a erros imprevisíveis. Um colega meu encontrou um problema muito estranho. Vejamos o código primeiro:
var o = []; o ['nome'] = 'liming'; var s = json.Stringify (O);
Ele pensou que o atributo de nome do objeto O estaria na sequência JSON, mas o resultado não foi nada. Eu também era muito estranho na época, mas tinha uma premonição de que era um problema de misturar matrizes e objetos. Eu tentei e foi realmente o seu problema. Mais tarde, descobri na especificação da ECMA que as matrizes são serializadas de acordo com as regras da JA. Portanto, você deve desenvolver um bom hábito de programação, usar matrizes e objetos corretamente e não os misturar.
11. Prometa programação elegante
Acredito que as pessoas que foram expostas aos NodeJs tiveram essa experiência. Quando o retorno de chamada assíncrono é aninhado no retorno de chamada assíncrona, o código parece muito confuso e carece de facilidade de legibilidade. Esse dilema dos NodeJs pode ser superado com as promessas. A promessa é como uma ferramenta de escultura que torna seu código elegante e bonito. Há uma especificação A+ para promessas e existem vários métodos de implementação on -line, você pode consultar.