この最初の記事では、nodejsのプログラミングの詳細について説明します。
1。配列を繰り返します
for(var i = 0、l = arr.length; i <l; i ++)
この方法で書くことの利点の1つは、各ループの1つのステップで配列オブジェクトの長さを取得する操作を取得することです。配列の長さが長いほど、値が明らかになります。
2。変数の信頼性を決定します
if(a){...} // a = ''、a = '0'、a = []、a = {}条件付き判断の結果は次のとおりです。偽、真、真、真。この結果はPHPの結果とは異なるため、混乱しないでください。また、非同一性の判断に似ている状況を区別する必要があります。
3。0値の非同一性判断
1 if(0 == '0'){...} // true2 if(0 == []){...} // true3 if(0 == [0]){...} // true4 if(0 == {}){...} // false5 if(0 == null){...} // false6 if(0 == redefined){...} // false実際、そのような奇妙な判断はたくさんあり、私はより一般的な判断だけをリストしました。ルールを理解したい場合は、[JavaScript] JavaScriptのリレーショナル操作の詳細な分析と声明の場合の別のブログ投稿を参照してください。
4。Parseintのtrap
var n = parseint(s); // s = '010'
声明が実行された後、N値は10ではなく8です。多くの人はこれを知っていますが、プログラミングに間違いがあることは避けられず、私はそれを深く理解しています。したがって、次の方法で書くことが最善であるため、エラーはありません。
var n = parseint(s、10);
5。使用する前に変数を宣言する必要があります
変数を宣言せずに直接間違いを犯すことはありませんが、このように書くときに間違いを犯すのは簡単です。インタープリターはグローバル変数として解釈されるため、他のグローバル変数で分割することでエラーを引き起こすのは簡単です。したがって、変数を使用する前に、変数を宣言する良い習慣を開発する必要があります。
6.ループには非同期があります
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はテーブルクエリ操作であり、非同期操作です}出力の結果は同じであり、i = arr.Length-1の場合は出力コンテンツです。 JavaScriptはシングルスレッドであるため、非同期操作を実行する前に完全なループの同期コンテンツを実行します。コードの匿名のコールバック関数は、非同期コールバックです。関数が実行されると、forループとその後のいくつかの同期操作が実行されます。閉鎖原理のため、この関数は、sql変数の内容と、forループの最後のループのi変数を保持し、それが誤った結果につながります。
それで、私は何をすべきですか?次の2つの解決策があります。1つは、次のように、即時機能を使用することです。
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);}別の方法は、非同期操作部分を抽出し、次のように単一の関数を書き込むことです。
var outputSql = function(sql、i){db.query(sql、function(){sys.log(i + ':' + sql);}); //db.Queryはテーブルクエリ操作であり、これは非同期操作です} for outputsql(sql、i); }7.大量のデータを処理するときは、ループネスティングを避けるようにしてください。
ループネスティングの処理時間は、データの量が増加すると指数関数的に増加するため、可能な限り回避する必要があります。この場合、より良い方法がなければ、一般的な戦略は、時間と空間を交換すること、つまり、二次循環データのハッシュマッピングテーブルを確立することです。もちろん、特定の状況分析も必要です。もう1つのことは、Array.sort()(この方法は2層のループで実装する必要がある)など、いくつかの方法がループ本体自体であるため、使用するときは注意が必要です。
8。再帰的な呼び出しを避けるようにしてください。
再帰的な呼び出しの利点は、コードが簡潔で、実装が簡単である一方で、その欠点が非常に重要であることです。次の説明は次のとおりです。
(1)関数スタックのサイズは、再帰レベルで直線的に成長し、関数スタックには上限値があります。再帰が特定の数のレイヤーに到達すると、関数スタックがオーバーフローし、プログラムエラーが発生します。
(2)各再帰レイヤーは、追加のスタックプレスおよびスタックリリース操作、つまり、機能コール中に保存サイトと回復サイトを追加します。
したがって、再帰的な呼び出しは可能な限り回避する必要があります。
9。モジュールファイルのスコープ分離について。
NodeがJavaScriptモジュールファイルをコンパイルすると、次のように、そのコンテンツは最初とEndにラップされています。
(function(exports、require、module、__filename、__dirname){JavaScriptファイルコード});これにより、各モジュールファイル間のスコープ分離が可能になります。したがって、nodejsモジュールファイルを記述する場合、スコープ分離カプセル化の別のレイヤーを追加する必要はありません。たとえば、次のコード形式では、関数呼び出しの追加レイヤーのみが追加されますが、これは推奨されません。
(関数(){ ... …})();10.配列とオブジェクトを混ぜないでください
エラーコードの例は次のとおりです。
var o = []; o ['name'] = 'liming';
混合配列とオブジェクトは、予測不可能なエラーにつながる可能性があります。私の同僚が非常に奇妙な問題に遭遇しました。最初にコードを見てみましょう:
var o = []; o ['name'] = 'liming'; var s = json.stringify(o);
彼は、オブジェクトOの名前属性がJSON文字列にあると考えていましたが、結果は何もありませんでした。私も当時非常に奇妙でしたが、それがアレイとオブジェクトを混合する問題であるという予感がありました。私はそれを試しました、そしてそれは確かにその問題でした。その後、ECMA仕様で、ArrayがJAルールに従ってシリアル化されていることがわかりました。したがって、優れたプログラミング習慣を開発し、アレイとオブジェクトを正しく使用し、それらを混ぜないでください。
11。エレガントなプログラミングを約束します
Nodejsにさらされた人々はこの経験をしたと思います。非同期コールバックが非同期コールバックにネストされている場合、コードは非常に混乱しているようで、読みやすさの容易さがありません。 Nodejsのこのジレンマは、約束を克服できます。約束は、コードをエレガントで美しくする彫刻ツールのようなものです。約束のためのA+仕様があり、オンラインでいくつかの実装方法があり、それを参照できます。