ホームページ >ウェブフロントエンド >jsチュートリアル >私のNodeJs学習まとめ(1)_node.js
この最初の記事では、NodeJ のプログラミングの詳細について説明します。
1. 配列を走査します
for (var i=0, l=arr.length; i<l; i++)
この方法で記述することの利点の 1 つは、配列オブジェクトの長さを取得するために各ループで 1 つのステップが節約されることです。配列の長さが長くなるほど、値がより明確になります。
2. 変数が true か false かを判断します
if (a) {...} //a='', a='0', a=[], a={}
if 条件判定の結果は、false、true、true、true となります。この結果は PHP の結果とは異なりますので、混同しないでください。非同一性の判断と類似する状況を区別することも必要です。
3. 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
実際、そのような奇妙な判断はたくさんありますが、私はより一般的なものだけをリストしました。ルールを理解したい場合は、私の他のブログ投稿「[JavaScript] JavaScript のリレーショナル操作と if ステートメントの詳細な分析」を参照してください。
4. parseInt の罠
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 ループとその後のいくつかの同期操作が完了します。クロージャーの原理により、この関数は for ループの最後のループで sql 変数と 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 (var i=0, l=arr.length; i<l; i++) { var sql = "select * from nx_user"; outputSQL(sql, i); }
ネストループはデータ量が増えると処理時間が指数関数的に増加するため、できるだけ避ける必要があります。この状況で、より良い方法がない場合、一般的な戦略は、スペースを時間と交換すること、つまり、二次循環データのハッシュ マッピング テーブルを確立することです。もちろん、特定の状況はケースバイケースで分析する必要があります。もう 1 つ言及すべき点は、Array.sort() などの一部のメソッド自体がループ本体であるため (このメソッドは 2 層のループを使用して実装する必要があります)、使用する際には注意が必要です。
8. 再帰呼び出しを避けるようにしてください。
再帰呼び出しの利点は、コードが簡潔で実装が簡単であることですが、その欠点は非常に重要であるため、次のように説明します。
(1) 関数スタックのサイズは再帰レベルに応じて直線的に増加し、関数スタックには上限があります。再帰が特定のレベルに達すると、関数スタックがオーバーフローしてプログラム エラーが発生します。 🎜>
(2) 各再帰レベルでは、追加のスタック プッシュおよびポップ操作が追加されます。つまり、関数呼び出し中にシーンを保存し、シーンを復元します。
したがって、再帰呼び出しは可能な限り避けるべきです。
9. モジュールファイルのスコープ分離について。
Node が JavaScript モジュール ファイルをコンパイルすると、そのコンテンツは次のように先頭と末尾がパッケージ化されます。
(function(exports, require, module, __filename, __dirname){ 你的JavaScript文件代码 });これにより、各モジュール ファイル間のスコープの分離が可能になります。したがって、NodeJs モジュール ファイルを作成するときに、スコープ分離カプセル化のレイヤーを自分で追加する必要はありません。次のコード形式は、関数呼び出しの追加レイヤーを追加するだけなので、推奨されません:
(function(){ ... ... })();10. 配列とオブジェクトを混合しないでください
以下はエラーコードの例です:
var o = []; o['name'] = 'LiMing';配列とオブジェクトを混合すると、予期しないエラーが発生する可能性があります。私の同僚の 1 人が非常に奇妙な問題に遭遇しました。まずコードを見てみましょう。
彼は当初、オブジェクト o の name 属性が JSON 文字列に含まれると考えていましたが、結果はそうではありませんでした。私もその時はとても驚きましたが、配列とオブジェクトの混在の問題だろうと直感して試してみたところ、それが問題だったことが分かりました。その後、ECMA 仕様で、配列は JA ルールに従ってシリアル化されることがわかりました。したがって、良いプログラミング習慣を身につけ、配列とオブジェクトを正しく使用し、混合しないようにする必要があります。
11. エレガントな約束のプログラミング
非同期コールバックが非同期コールバック内にネストされると、コードが混乱して読みにくくなるということは、nodeJ に触れたことがある人なら誰でも経験したことがあると思います。 NodeJ のこのジレンマは、Promise の助けを借りて克服できます。 Promise は彫刻家のようなもので、コードをエレガントで美しくします。 PromiseにはA仕様があり、ネット上に実装方法がいくつかあるので参考にしてください。