最近、io.js用のES6コードをたくさん書いています。世の中には学ぶべきコードがあまりないので、自分の慣習を自分で定義しているような気がします。
私の質問は、const
とlet
をいつ使用するかについてです。
私はこのルールを適用しています。可能であれば、const
を使用してください。 let
は、値を変更する必要があることがわかっている場合にのみ使用してください。 (後で値を変更する必要があることが判明した場合は、いつでも戻ってconst
をlet
に変更できます。)
このルールの主な理由は、一貫して適用するのが簡単なことです。灰色の部分はありません。
問題は、私がこのルールを適用すると、実際には私の宣言の95%がconst
であるということです。そして、これは私には奇妙に見えます。 let
ループのi
のようなもの、または累積フィボナッチ総数のようなもの(実際にはあまり出てこない)にのみfor
を使用しています。私はこれに驚きました。これまでのところ、私のES5コードの「変数」の95%は、変化しない値用であることがわかりました。しかし、私のコード全体でconst
を見ると、どういうわけか間違っているように感じます。
だから私の質問は:const
をこれだけ使ってもいいですか?私は本当にconst foo = function () {...};
のようなことをしているのでしょうか?
または、モジュールの上部にリテラルをハードコーディングしているような状況(const MARGIN_WIDTH = 410;
のようにフルキャップで行う)のためにconst
を予約する必要がありますか?
ここでの返信はJavaScript固有ではありません。
簡単な方法でそうすることができる言語の経験則として、私は常にconst/final/readonly /それが可能な限りあなたの言語で呼ばれるものを常に使用すると言います。理由は単純です。何が変更可能で何が変更不可能であるかが明らかである場合は、コードについて推論する方がはるかに簡単です。これに加えて、多くの言語では、constとして宣言した変数に誤って割り当てたときに何かが間違っていることを通知するツールサポートを利用できます。
戻ってconstをletに変更するのはとても簡単です。そして、デフォルトでconstになると、そうする前によく考えることになります。そして、これは多くの場合良いことです。
変数が予期せず変更されることに関連するバグをいくつ見ましたか?私はたくさん推測します。私が目にするバグの大部分は、予期しない状態の変化に関係していることを知っています。 constを自由に使用してこれらのバグをすべて取り除くことはできませんが、それらの多くは取り除くことができます。
また、多くの関数型言語には不変変数があり、すべての変数はデフォルトでconstです。たとえば、Erlang、またはF#を見てください。割り当てなしのコーディングはこれらの言語で完全に機能し、関数型プログラミングが好まれる多くの理由の1つです。優れたプログラマーになるためには、状態の管理についてこれらの言語から学ぶべきことがたくさんあります。
そして、それはすべてconstで非常にリベラルであることから始まります! ;)letに比べて、書く文字が2文字だけ多いので、先に進んでconst
すべてのものを作成してください!
const
オブジェクトキーは変更可能であるため、注意してください。
ここから: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
オブジェクトキーは保護されていません
この例を考えてみましょう:
const colors = {red: "#f00"};
console.log(colors); // { "red": "#f00" }
colors.red = "#00f";
colors.green = "#0f0";
console.log(colors); // { "red": "#00f", "green": "#0f0" }
配列についても同じです:
const numbers = [1, 2, 3];
console.log(numbers); // [ 1, 2, 3 ]
numbers.Push(4);
console.log(numbers); // [ 1, 2, 3, 4 ]
私は完全に自分では決めていませんが、すべての非配列/非オブジェクトにconst
を使用し、オブジェクト/配列にlet
を使用することを検討しています。
心配しないでください。 const
はJavaScriptへの驚くべき追加であり、それが理にかなっているすべての場所で使用することをお勧めします。より堅牢なコードになります。
オブジェクトの場合、const
は変数を再割り当てから保護しますが、不変オブジェクトが必要な場合はObject.freeze
メソッド。以下を参照してください。
const immutableOject = Object.freeze({immutableProperty: 'foo'});
const
は再割り当てからのみ保護し、freeze
メソッドはすべての直接のプロパティを保護します。ネストされたすべてのプロパティも不変である必要がある場合は、それらを再帰的にfreeze
する必要があります。
私の ES6 const
は不変性についてではありません 投稿では、仕様に従ってconst
の意味を正確に説明します。
これらの客観的な事実に基づいて、ここに私の個人的な好みがあります:
[…] ES6コードで次のように
let
とconst
を使用することは理にかなっています:
- デフォルトで
const
を使用- 再バインド(つまり、任意の形式の再割り当て)が必要な場合にのみ、
let
を使用します- (
var
はES6では使用しないでください)
主観的かもしれませんが、これは仕様の意図に最もよく一致するという事実です。
デフォルトでlet
を使用する人は通常、const
変数を定数として扱います(設計上、必ずしもそうとは限りません)。自分にはそれぞれですが、私は意図した目的のために物事を使用することを好みます。人々は誤解に基づいてそれに割り当てられたある意味のある意味のためではありません。
定数にのみconst
を使用することは HTML <aside>
element サイドバーのコンテンツのみ。
コードの読みやすさと理解を助けるために考えた私の個人的なアプローチ:
let
は、存続期間の短い変数専用で、1行で定義され、後で変更されません。一般に、タイピングの量を減らすためだけにある変数。例えば:
_for (let key in something) {
/* we could use `something[key]` for this entire block,
but it would be too much letters and not good for the
fingers or the eyes, so we use a radically temporary variable
*/
let value = something[key]
...
}
_
モジュール全体で一定であることがわかっているすべてのnamesのconst
ローカル定数値は含まれません。たとえば、上記の例のvalue
はスコープが一定であり、const
で宣言できますが、反復回数が多く、それぞれに同じname、 "value"の値があるため、読者をだまして、value
は常に同じだと思わせることができます。モジュールと関数は、const
変数の最良の例です。
_const PouchDB = require('pouchdb')
const instantiateDB = function () {}
const codes = {
23: 'atc',
43: 'qwx',
77: 'oxi'
}
_
var
は、変数である場合とそうでない場合があるすべてのものです。ローカルで定数であり、let
に適さない場合(つまり、単純な直接宣言では完成しない)であっても、コードを読む人を混乱させる可能性がある名前は、var
で宣言されている場合に適用されます。例えば:
_var output = '\n'
lines.forEach(line => {
output += ' '
output += line.trim()
output += '\n'
})
output += '\n---'
for (let parent in parents) {
var definitions = {}
definitions.name = getName(parent)
definitions.config = {}
definitions.parent = parent
}
_
さらなる解説と可能な将来の更新 ここ 。
JavaScriptは、変数を関数などにすることができるという点で少し特殊ですが、C#ではJavaまたは他の同様のCスタイル言語:
const public void DoSomething()
const
は奇妙です。これは、これらの言語のメソッド宣言が変更され、他の何かにコンパイルされると、何が起こっても(それは存在する可能性のある恐ろしいハックを無視して)変更できないためです。
JavaScriptが何か違うのはなぜですか?したがって、コンパイルはされませんが、コンパイラが提供できる安全性を破棄する必要があるという意味ではありません。 const
キーワードを使用すると、安全性が高まり、アプリケーションの堅牢性が高まります。