var
およびのセマンティクスlet
var
そしてlet
マシンへと他のプログラマへの文のとおりです。
この割り当ての価値は、実行の過程で変化することを意図しています。この割り当ての最終的な値に依存しないでください。
使用する意味var
とlet
var
そして、let
他のプログラマーに、宣言から最終的に使用するまでの間にあるすべてのコードを読み取らせ、プログラムの実行におけるその時点での割り当ての値について推論します。
ESLintおよびその他の言語サービスのマシン推論を弱め、後の割り当てで誤って入力された変数名を検出し、内部スコープが宣言を忘れた外部スコープ変数名のスコープ再利用を弱めます。
また、ランタイムがすべてのコードパスで多くの反復を実行し、最適化する前に、それらが実際に定数であることを検出します。これはバグの検出と開発者の理解可能性ほど問題ではありませんが。
いつ使うか const
参照の値が実行中に変化しない場合、プログラマーの意図を表す正しい構文はconst
です。オブジェクトの場合、参照は不変ですが、オブジェクトはそうではないため、参照の値を変更すると、別のオブジェクトを指すことになります。
" const
"オブジェクト
オブジェクト参照の場合、ポインターを別のオブジェクトに変更することはできませんが、作成されてconst
宣言に割り当てられたオブジェクトは変更可能です。const
参照される配列の項目を追加または削除したり、const
参照されるオブジェクトのプロパティキーを変更したりできます。
不変オブジェクトを実現するために(これもまた、コードを人間やマシンのために推論しやすくします)、次のようObject.freeze
にオブジェクトを宣言/割り当て/作成することができます。
const Options = Object.freeze(['YES', 'NO'])
Object.freezeはパフォーマンスに影響を与えますが、コードはおそらく他の理由で遅くなります。プロファイルしたい。
また、変更可能なオブジェクトをステートマシンにカプセル化し、深いコピーを値として返すこともできます(これがReduxとReactの状態のしくみです)。第一原理からこれを構築する方法の例については、ブラウザJSでの変更可能なグローバル状態の回避を参照してください。
いつvar
そしてlet
良い試合か
let
var
変更可能な状態を表します。私の意見では、これらは実際の変更可能な状態をモデル化するためにのみ使用されるべきです。「接続は生きていますか?」のようなもの。
これらは、「接続の現在の状態」を表す定数値を公開するテスト可能な状態マシンに最適にカプセル化されます。これは、任意の時点で定数であり、コードの残りの部分が実際に関心を持っているものです。
プログラミングはすでに、副作用の合成とデータの変換で十分に困難です。変数を含む可変状態を作成することにより、すべての関数をテスト不可能な状態マシンに変換します。
より微妙な説明については、ミュータントの回避-のケースをconst
参照してください。