web-dev-qa-db-ja.com

ES6で「let」と「const」をどれだけ使用すればよいですか?

最近、io.js用のES6コードをたくさん書いています。世の中には学ぶべきコードがあまりないので、自分の慣習を自分で定義しているような気がします。

私の質問は、constletをいつ使用するかについてです。

私はこのルールを適用しています。可能であれば、constを使用してください。 letは、値を変更する必要があることがわかっている場合にのみ使用してください。 (後で値を変更する必要があることが判明した場合は、いつでも戻ってconstletに変更できます。)

このルールの主な理由は、一貫して適用するのが簡単なことです。灰色の部分はありません。

問題は、私がこのルールを適用すると、実際には私の宣言の95%がconstであるということです。そして、これは私には奇妙に見えます。 letループのiのようなもの、または累積フィボナッチ総数のようなもの(実際にはあまり出てこない)にのみforを使用しています。私はこれに驚きました。これまでのところ、私のES5コードの「変数」の95%は、変化しない値用であることがわかりました。しかし、私のコード全体でconstを見ると、どういうわけか間違っているように感じます。

だから私の質問は:constをこれだけ使ってもいいですか?私は本当にconst foo = function () {...};のようなことをしているのでしょうか?

または、モジュールの上部にリテラルをハードコーディングしているような状況(const MARGIN_WIDTH = 410;のようにフルキャップで行う)のためにconstを予約する必要がありますか?

217
callum

ここでの返信はJavaScript固有ではありません。

簡単な方法でそうすることができる言語の経験則として、私は常にconst/final/readonly /それが可能な限りあなたの言語で呼ばれるものを常に使用すると言います。理由は単純です。何が変更可能で何が変更不可能であるかが明らかである場合は、コードについて推論する方がはるかに簡単です。これに加えて、多くの言語では、constとして宣言した変数に誤って割り当てたときに何かが間違っていることを通知するツールサポートを利用できます。

戻ってconstをletに変更するのはとても簡単です。そして、デフォルトでconstになると、そうする前によく考えることになります。そして、これは多くの場合良いことです。

変数が予期せず変更されることに関連するバグをいくつ見ましたか?私はたくさん推測します。私が目にするバグの大部分は、予期しない状態の変化に関係していることを知っています。 constを自由に使用してこれらのバグをすべて取り除くことはできませんが、それらの多くは取り除くことができます。

また、多くの関数型言語には不変変数があり、すべての変数はデフォルトでconstです。たとえば、Erlang、またはF#を見てください。割り当てなしのコーディングはこれらの言語で完全に機能し、関数型プログラミングが好まれる多くの理由の1つです。優れたプログラマーになるためには、状態の管理についてこれらの言語から学ぶべきことがたくさんあります。

そして、それはすべてconstで非常にリベラルであることから始まります! ;)letに比べて、書く文字が2文字だけ多いので、先に進んでconstすべてのものを作成してください!

183
wasatz

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を使用することを検討しています。

57
lax4mike

心配しないでください。 constはJavaScriptへの驚くべき追加であり、それが理にかなっているすべての場所で使用することをお勧めします。より堅牢なコードになります。

オブジェクトの場合、constは変数を再割り当てから保護しますが、不変オブジェクトが必要な場合はObject.freezeメソッド。以下を参照してください。

const immutableOject = Object.freeze({immutableProperty: 'foo'});

constは再割り当てからのみ保護し、freezeメソッドはすべての直接のプロパティを保護します。ネストされたすべてのプロパティも不変である必要がある場合は、それらを再帰的にfreezeする必要があります。

26
clean_coding

私の ES6 constは不変性についてではありません 投稿では、仕様に従ってconstの意味を正確に説明します。

これらの客観的な事実に基づいて、ここに私の個人的な好みがあります:

[…] ES6コードで次のようにletconstを使用することは理にかなっています:

  • デフォルトでconstを使用
  • 再バインド(つまり、任意の形式の再割り当て)が必要な場合にのみ、letを使用します
  • varはES6では使用しないでください)

主観的かもしれませんが、これは仕様の意図に最もよく一致するという事実です。

デフォルトでletを使用する人は通常、const変数を定数として扱います(設計上、必ずしもそうとは限りません)。自分にはそれぞれですが、私は意図した目的のために物事を使用することを好みます。人々は誤解に基づいてそれに割り当てられたある意味のある意味のためではありません。

定数にのみconstを使用することは HTML <aside> element サイドバーのコンテンツのみ。

20
Mathias Bynens

コードの読みやすさと理解を助けるために考えた私の個人的なアプローチ:


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]
  ...
}
_

モジュール全体で一定であることがわかっているすべてのnamesconstローカル定数値は含まれません。たとえば、上記の例の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
}
_

さらなる解説と可能な将来の更新 ここ

4
fiatjaf

JavaScriptは、変数を関数などにすることができるという点で少し特殊ですが、C#ではJavaまたは他の同様のCスタイル言語:

const public void DoSomething()

constは奇妙です。これは、これらの言語のメソッド宣言が変更され、他の何かにコンパイルされると、何が起こっても(それは存在する可能性のある恐ろしいハックを無視して)変更できないためです。

JavaScriptが何か違うのはなぜですか?したがって、コンパイルはされませんが、コンパイラが提供できる安全性を破棄する必要があるという意味ではありません。 constキーワードを使用すると、安全性が高まり、アプリケーションの堅牢性が高まります。

1
Joe