私は最近javascriptで const キーワードに出くわしました。私が言うことができるものから、それは immutable variables を作成するために使われ、そしてそれが再定義されないことを確かめるためにテストされました(node.jsで)
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
私はそれがすべてのブラウザでまだ標準化されていないことを実感します - しかし私はnode.js/v8の文脈だけに興味があり、そして特定の 開発者/プロジェクト varキーワードを使用しても同じ効果が得られます。
質問 ?
var の代わりに const を使用するのが適切な場合
再割り当てされない変数が宣言されるたびに使用されるべきですか?
var が const の代わりに使用されている場合、またはその逆の場合、実際に違いはありますか?
質問には2つの側面があります。const
の代わりにvar
を使用することの技術的側面と、それを行う際の人間関連の側面です。
技術的な違いは重要です。コンパイルされた言語では、定数はコンパイル時に置き換えられ、その使用はデッドコード除去のような他の最適化を可能にしてコードの実行時効率をさらに向上させるでしょう。最近の(大まかに使用されている)JavaScriptエンジンは実際にはより良いパフォーマンスを得るためにJSコードをコンパイルするので、constキーワードを使用すると上記の最適化が可能であり実行されるべきであることを彼らに知らせるでしょう。これにより、パフォーマンスが向上します。
人間関連の側面はキーワードの意味論についてです。変数は、変更が予想される情報を含むデータ構造です。定数は、決して変更されない情報を含むデータ構造です。エラーの余地がある場合は、var
を常に使用してください。ただし、プログラムの有効期間内に変更されないすべての情報をconst
で宣言する必要はありません。異なる状況下で情報を変更する必要がある場合は、実際の変更がコードに表示されていなくても、var
を使用してそれを示します。
2017年アップデート
この答えはまだ多くの注目を集めています。この回答は2014年の初めに投稿されたもので、それ以来多くの点で変更が加えられています。 ecmascript-6 supportが標準になりました。 最近のブラウザはすべてconst
をサポートしているので、問題なく使用することはかなり安全です。
2014年からの最初の回答
かなりまともなブラウザのサポートがあるにもかかわらず 、私は今のところそれを使用しないでください。 From MDNによるconst
の記事
現在のconstの実装はMozilla固有の拡張であり、ECMAScript 5の一部ではありません。これはFirefox&Chrome(V8)でサポートされています。 Safari 5.1.7およびOpera 12.00以降、これらのブラウザでconstを使用して変数を定義した場合でも、後でその値を変更できます。 Internet Explorer 6-10ではサポートされていませんが、Internet Explorer 11には含まれています。constキーワードは現在、(varで宣言された変数のように)関数スコープ内で定数を宣言します。
それはそれから言い続ける:
const
はECMAScript 6によって定義されますが、意味は異なります。 letステートメントで宣言された変数と同様に、constで宣言された定数はブロックスコープになります。
もしあなたがconst
を使用するのであれば、少し古いブラウザをサポートするための回避策を追加する必要があるでしょう。
これまでの答えを統合するために、パフォーマンス上の理由とは別に、定数変数を宣言することに明らかな利点があります。誤ってコード内でそれらを変更または再宣言しようとすると、プログラムは値を変更したりエラーをスローしません。
たとえば、次のように比較します。
// Will output 'SECRET'
const x = 'SECRET'
if (x = 'ANOTHER_SECRET') { // Warning! assigning a value variable in an if condition
console.log (x)
}
と:
// Will output 'ANOTHER_SECRET'
var y = 'SECRET'
if (y = 'ANOTHER_SECRET') {
console.log (y)
}
または
// Will throw TypeError: const 'x' has already been declared
const x = "SECRET"
/* complex code */
var x = 0
と
// Will reassign y and cause trouble
var y = "SECRET"
/* complex code */
var y = 0
const
を使用する理由については、@ Tibosの答えは素晴らしいです。
しかし、あなたは言った:
私が知ることができることから、それは不変変数を作成するために使用されます
それはwrongです。変数の変更は、再割り当てとは異なります。
var hello = 'world' // assigning
hello = 'bonjour!' // reassigning
Constでは、それを行うことはできません。
const hello = 'world'
hello = 'bonjour!' // error
ただし、変数を変更できます。
const marks = [92, 83]
marks.Push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.
そのため、=
記号を使用して変数の値withoutを変更するプロセスはミュートされます。
注:+=
は、たとえば...再割り当てです!
var a = 5
a += 2 // is the same as a = a + 2
要するに、const
はmutating変数を妨げるものではなく、re-assigningそれら。
const
は not immutableです。
_ mdn _ から:
Const宣言は、値への読み取り専用の参照を作成します。それが保持する値が不変であることを意味するのではなく、単に変数識別子が再割り当てできないということです。
あなたは素晴らしい答えを持っています、しかしそれを単純にしましょう。
const
はあなたが定義された定数を持っているときに使われるべきです(プログラムの実行中に変化しないように読んでください)。
例えば:
const pi = 3.1415926535
後で実行するときに変更される可能性があると思われる場合は、var
を使用してください。
例に基づく実際的な違いは、const
を使うと、piは3.14 [...]になると常に仮定するということです。
あなたがそれをvar
として定義するならば、それは3.14 [...]かもしれません。
より技術的な答えを得るために@Tibosは学術的に正しいです。
var :変数を宣言します。値の初期化はオプションです。
let :ブロックスコープでローカル変数を宣言する。
const :読み込み専用の名前付き定数を宣言します。
例:
var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3
let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);
// const c;
// c = 9; //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.
私の経験では、 const を使用します。コードを調べてハードコードされたビットを探す必要なく、後で変更したい場合があります。ファイルパスまたはサーバー名。
あなたのテストのエラーは別のものです、あなたはxと呼ばれる別の変数を作ることを試みています、これはより正確なテストでしょう。
const x = 'const';
x = 'not-const';
本当に個人的な好み。あなたが言うように、あなたはconstを使うことができます、それは再割り当てされず、定数です。例えばあなたがあなたの誕生日を割り当てたいと思うならば。あなたの誕生日は変わらないので、あなたはそれを定数として使うことができます。しかし、あなたの年齢は変化するので、それは変数になるかもしれません。
概要:
constはimmutable binding)を作成します。const変数識別子は再割り当てできません。
const a = "value1";
で再割り当てすることはできません
a = "value2";
ただし、const identifierがオブジェクトまたは配列を保持している場合、その値を再割り当てしない限り変更できます。
const x = { a: 1 }
x.a = 2; //is possible and allowed
const numbers = [1, 2];
numbers.Push(3); //is possible and allowed
constはブロックスコープはletはvar(これは関数スコープ)と同じではありません)と同じです。
手短に言うと、何かが再割り当てによる変更use constelse letまたはvar)を使いたいスコープによって変わります).
再割り当てによって何が変更され、何が変更されないのか明らかなように、コードについて考えるのははるかに簡単です。 constをletに変更するのは簡単です。そしてデフォルトでconstにすることで、そうする前に二度考えることになります。そしてこれは多くの場合良いことです。
1)定数参照、例えばconst x = [] - 配列は変更できますが、xは他の配列を指すことはできません。 2)スコープをブロックします。 constとletが一緒にecma6/2015のvarを置き換えます https://strongloop.com/strongblog/es6-variable-declarations/ の議論を参照してください
Main point is that how to decide which one identifier should be used during development.
In Java-script here are three identifiers.
1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using Push)
3. let (Can re-initialize but can't re-declare)
'var':コード標準について話すときのコード化の時には、私たちは通常他のユーザ/開発者が理解しやすいものの識別子の名前を使います。例えば、私たちが働いている場合、いくつかの入力を使用してこれを処理し、いくつかの結果を返す多くの関数を考えてみました。
**Example of variable use**
function firstFunction(input1,input2)
{
var process = input1 + 2;
var result = process - input2;
return result;
}
function otherFunction(input1,input2)
{
var process = input1 + 8;
var result = process * input2;
return result;
}
上記の例では、両方の関数が異なる2の結果を生成しますが、同じ名前の変数を使用します。ここでは、 'process'と 'result'の両方が変数として使用されているはずです。
**Example of constant with variable**
const tax = 10;
const pi = 3.1415926535;
function firstFunction(input1,input2)
{
var process = input1 + 2;
var result = process - input2;
result = (result * tax)/100;
return result;
}
function otherFunction(input1,input2)
{
var process = input1 + 8;
var result = process * input2 * pi;
return result;
}
Javaスクリプトで 'let'を使用する前に、jsファイルの先頭に 'use strict'を追加する必要があります。
**Example of let with constant & variable**
const tax = 10;
const pi = 3.1415926535;
let trackExecution = '';
function firstFunction(input1,input2)
{
trackExecution += 'On firstFunction';
var process = input1 + 2;
var result = process - input2;
result = (result * tax)/100;
return result;
}
function otherFunction(input1,input2)
{
trackExecution += 'On otherFunction'; # can add current time
var process = input1 + 8;
var result = process * input2 * pi;
return result;
}
firstFunction();
otherFunction();
console.log(trackExecution);
上記の例では、特定のアクション中にどの関数が使用されなかったか、およびどの関数が使用されなかったかを追跡できます。
まず、const
について3つの便利なこと(let
と共有するスコープの改善を除く):
あなたの質問:
const
の代わりにvar
を使用するのが適切なのはいつですか?
値が決して変わらない変数を宣言しているときはいつでも、 can を実行できます。あなたが適切と考えるかどうかはあなたの好み/あなたのチームの好み次第です。
再割り当てされない変数が宣言されるたびに使用されるべきですか?
それはあなた/あなたのチーム次第です。
var is used in place of
const`であれば実際には何か違いがありますか?
はい:
var
とconst
は異なるスコープルールを持ちます。 (let
ではなくvar
と比較した方がよいかもしれません。)特に:const
とlet
はブロックスコープであり、グローバルスコープで使用されるときは(グローバルを作成するとしても)グローバルオブジェクトにプロパティを作成しません。 var
は、グローバルスコープ(グローバルスコープで使用されている場合)または関数スコープ(ブロック内で使用されている場合でも)のいずれかを持ち、グローバルスコープで使用されている場合、グローバルオブジェクトにプロパティを作成します。私はJSコンパイルビジネスのエキスパートではありませんが、v8はconstフラグから利用することを意味します。
通常、多くの変数を宣言して変更した後、メモリが断片化し、v8が実行を停止し、数秒のうちにしばらく時間がかかり、gcまたはガベージコレクションが行われます。
ある変数がconst v8で宣言されている場合は、他のconst変数との間にある固定サイズのコンテナに入れても変化しません。型は変更されないため、そのデータ型に対する適切な操作も節約できます。
'const'は、識別子が再割り当てされないことをコードに示しています。これは、 'const'、 'let'、または 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#)を使用する場合についてのよい記事です。 ukgxpfhao