JavaScriptのconstで混乱?私も!


先日、私はTwitterのコンセプトを中心に少し前後にconst JavaScriptで.カイル・シンプソンは誤解を指摘したconst 私が共有した記事の範囲内で.私の感情は多かれ少なかれ、混乱がどこから来るのかを理解することができますconst 私がそれを期待する方法を振る舞っていません(注、私はそれが間違っていると言っていません、私の予想とは異なります).

Hmm... I missed this issue when I read this article. But if he (and many others) misunderstands 'const', could it be partly because 'const' frequently doesn't behave the way you think it would.

— Brian Rinaldi ( )

その短い会話でさえ、多くの用語と概念は、投げられました.それで、私は、私が定数の概念とよりよく宣言された変数の概念を理解することができるようにconst JavaScriptで実際に動作します.

I should note that Kyle Simpson did write a post on this very topic, but it appears to be on a blog that is no longer live. He did share the version available via the Wayback Machine. It's worth a read as he goes into far more depth than I plan to.


何が定数ですか?


Googleの場合は“プログラミングで定数は何ですか?”一般的に定義されている方法で定数を定義する多数のページを見つけることができますWikipedia 通常実行中のプログラムで変更できない値として
表面では、これはかなり簡単です-値を設定し、変更することはできません.これは読みやすさとエラーチェックの両方に役立ちます.しかし、すべての言語に定数がないわけではなく、常に同じ処理を行うわけではありません.例えば、ある言語では定数が保持できる値の型は限られています.
それは一度は物事が混乱を得ることができる単純な値の種類を超えて取得します.これはここでの会話にとって重要です(そして、JavaScriptの定数の現実に対する私の自身の混乱の多くが入って来る).説明しようとするよりむしろ例をあげましょう.
このように定数を設定しましょう
const NAME = "Brian";
新しい価値を割り当てることを試みることは明らかですNAME を返します.しかし、次のようにすればどうなりますか
const ME = {name:'Brian'};
値を変更するとME.name , エラーが出たらいいですか.つは、技術的に、私はME それがまだ同じオブジェクトを指しているので、そのオブジェクトが変異されたとしても.JavaScriptでは、このエラーが発生しません.

コンピュータサイエンスの人々がプリミティブと不変性の概念に入るのは、この時点でです.私たちはこれらについて少し話をします、しかし、これをコンピュータサイエンス本の章に変えないために、私は彼らを非常に深くカバーするつもりはありません.

In brief, an immutable object is an object whose state cannot be modified after it is created. A primitive in JavaScript is "data that is not an object and has no methods." (source: MDN)


定数


The const キーワードは、JavaScriptにES 6(別名ES 2015)に追加されました.以前は、一般的な慣習は標準変数を使用することでした、しかし、すべてのキャップ名でMY_CONSTANT . これは変数が変更されるかどうかは影響しませんでした.開発者に変更すべきではないということを示唆するヒントでした.
JavaScript定数const グローバルスコープまたはブロックスコープのいずれかです.それらがブロックの中にあるなら{ and } ) それらは自動的にブロックされます.ブロック内でなければグローバルスコープであるが、var , ウィンドウオブジェクトのプロパティになりません.基本的にはconst -宣言された変数は常に最も内側の囲まれたブロックです.スクリプトの場合、それはグローバルスコープです、あるいは、モジュールの場合、それはそのモジュールの範囲です.(わかりやすくするためのヒント)
間のもう一つの面白い違いconst and var そうですhoisted 異なる.変数を宣言するときconst or let , 宣言はhoistedされますが、その値はundefined , したがって、宣言の前にアクセスしようとすると、参照エラーが発生します.下記をご覧くださいconsole.log で定義された変数の参照var リターンundefined しかし、2番目の使用const エラーを生成します.

これをtemporal dead zone , それはそれがはるかに不吉な音になります.
最後に重要なことに注意してくださいconst JavaScriptでは、前述したとおりです.

The const declaration creates a read-only reference to a value. It does not mean the value it holds is immutable, just that the variable identifier cannot be reassigned. (source)


再び、これは周りの混乱の場所ですconst から発散するようです.あなたが使っているならばconst with JavaScript primitive types (つまりboolean , number , stringなど)は、期待しているような方法を実行します(任意の再割り当てがエラーを発生します).しかし、使用するときconst with JavaScript objects (配列や関数を含む)、オブジェクトはまだ変更可能です.
周りのスコープの詳細を見てくださいlet and const , 全体の章がありますJavaScript for Impatient Programmers "オンlet and const アクセルRauschmayerによって.

あなたはconstを使用する必要がありますか?


これは特に答えるための厳しい質問ですlet ブロックスコーピングとhoistingの同じ利点を持っていますvar は、宣言される前に変数が誤ってアクセスされるような異常なエラーを引き起こす可能性があります.利益を探る人々const 通常、コードの読みやすさにフォーカスします.使用によってconst , あなたは、この特定の変数が変化してはならないことを示しました、そして、それはある程度それを強制します.
引数const 'しかし、読者の読みやすさは、この記事の冒頭で指摘されているように、人々が定期的に誤解をしているように見えるという事実によって少し強調されています.はい、この変数の再割り当てに対していくつかの保護がありますがKyle's article :

Actually, many developers assert this protection keeps you from having some unsuspecting developer accidentally change a const. Except, in reality, I think the likelihood is that a developer who needs to change a variable and gets a const-thrown error about it will probably just change the const to let and go on about their business.


それで、保護const 提供は最小限です、それは単にスタイルの好みの問題になりますlet and const . あなたの変数が変更されることを意図しない原始的な値を保持するならばconst 合理的な選択です.ただし、値がプリミティブ値以外の場合はconst 潜在的な視点から、有用性よりも潜在的に混乱する可能性があります.