web-dev-qa-db-ja.com

JavaScriptで定数?いつ使うのか、必要なのか

私は最近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 の代わりに使用されている場合、またはその逆の場合、実際に違いはありますか?

316
axdg

質問には2つの側面があります。constの代わりにvarを使用することの技術的側面と、それを行う際の人間関連の側面です。

技術的な違いは重要です。コンパイルされた言語では、定数はコンパイル時に置き換えられ、その使用はデッドコード除去のような他の最適化を可能にしてコードの実行時効率をさらに向上させるでしょう。最近の(大まかに使用されている)JavaScriptエンジンは実際にはより良いパフォーマンスを得るためにJSコードをコンパイルするので、constキーワードを使用すると上記の最適化が可能であり実行されるべきであることを彼らに知らせるでしょう。これにより、パフォーマンスが向上します。

人間関連の側面はキーワードの意味論についてです。変数は、変更が予想される情報を含むデータ構造です。定数は、決して変更されない情報を含むデータ構造です。エラーの余地がある場合は、varを常に使用してください。ただし、プログラムの有効期間内に変更されないすべての情報をconstで宣言する必要はありません。異なる状況下で情報を変更する必要がある場合は、実際の変更がコードに表示されていなくても、varを使用してそれを示します。

436
Tibos

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を使用するのであれば、少し古いブラウザをサポートするための回避策を追加する必要があるでしょう。

70
James Donnelly

これまでの答えを統合するために、パフォーマンス上の理由とは別に、定数変数を宣言することに明らかな利点があります。誤ってコード内でそれらを変更または再宣言しようとすると、プログラムは値を変更したりエラーをスローしません。

たとえば、次のように比較します。

// 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
37
janesconference

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

要するに、constmutating変数を妨げるものではなく、re-assigningそれら。

31
math2001

const not immutableです。

_ mdn _ から:

Const宣言は、値への読み取り専用の参照を作成します。それが保持する値が不変であることを意味するのではなく、単に変数識別子が再割り当てできないということです。

29
Antoine

あなたは素晴らしい答えを持っています、しかしそれを単純にしましょう。

constはあなたが定義された定数を持っているときに使われるべきです(プログラムの実行中に変化しないように読んでください)。

例えば:

const pi = 3.1415926535

後で実行するときに変更される可能性があると思われる場合は、varを使用してください。

例に基づく実際的な違いは、constを使うと、piは3.14 [...]になると常に仮定するということです。

あなたがそれをvarとして定義するならば、それは3.14 [...]かもしれません。

より技術的な答えを得るために@Tibosは学術的に正しいです。

10
Edgar Griñant

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.
7
Srikrushna Pal

私の経験では、 const を使用します。コードを調べてハードコードされたビットを探す必要なく、後で変更したい場合があります。ファイルパスまたはサーバー名。

あなたのテストのエラーは別のものです、あなたはxと呼ばれる別の変数を作ることを試みています、これはより正確なテストでしょう。

const x = 'const';
x = 'not-const';
6
Funkotron_King

本当に個人的な好み。あなたが言うように、あなたはconstを使うことができます、それは再割り当てされず、定数です。例えばあなたがあなたの誕生日を割り当てたいと思うならば。あなたの誕生日は変わらないので、あなたはそれを定数として使うことができます。しかし、あなたの年齢は変化するので、それは変数になるかもしれません。

4
Carl Markham

概要:

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ブロックスコープletvar(これは関数スコープ)と同じではありません)と同じです。

手短に言うと、何かが再割り当てによる変更use constelse letまたはvar)を使いたいスコープによって変わります).

再割り当てによって何が変更され、何が変更されないのか明らかなように、コードについて考えるのははるかに簡単です。 constをletに変更するのは簡単です。そしてデフォルトでconstにすることで、そうする前に二度考えることになります。そしてこれは多くの場合良いことです。

3
Tejas Patel

1)定数参照、例えばconst x = [] - 配列は変更できますが、xは他の配列を指すことはできません。 2)スコープをブロックします。 constとletが一緒にecma6/2015のvarを置き換えます https://strongloop.com/strongblog/es6-variable-declarations/ の議論を参照してください

2
Genovo
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);

上記の例では、特定のアクション中にどの関数が使用されなかったか、およびどの関数が使用されなかったかを追跡できます。

2
vinod

まず、constについて3つの便利なこと(letと共有するスコープの改善を除く):

  • 値を変更してはいけないことを後でコードを読む人のために文書化します。
  • 意図的に戻って宣言を変更しない限り、それはあなた(またはあなたの後に来る誰か)が値を変更するのを防ぎます。
  • might JavaScriptエンジンに最適化の観点からいくつかの分析を保存します。たとえば、値は変更できないと宣言したので、エンジンは、値が変わるかどうかを判断するための作業を行う必要がないので、値が変わらないことに基づいて最適化するかどうかを決定できます。

あなたの質問:

constの代わりにvarを使用するのが適切なのはいつですか?

値が決して変わらない変数を宣言しているときはいつでも、 can を実行できます。あなたが適切と考えるかどうかはあなたの好み/あなたのチームの好み次第です。

再割り当てされない変数が宣言されるたびに使用されるべきですか?

それはあなた/あなたのチーム次第です。

var is used in place ofconst`であれば実際には何か違いがありますか?

はい:

  • varconstは異なるスコープルールを持ちます。 (letではなくvarと比較した方がよいかもしれません。)特に:constletはブロックスコープであり、グローバルスコープで使用されるときは(グローバルを作成するとしても)グローバルオブジェクトにプロパティを作成しません。 varは、グローバルスコープ(グローバルスコープで使用されている場合)または関数スコープ(ブロック内で使用されている場合でも)のいずれかを持ち、グローバルスコープで使用されている場合、グローバルオブジェクトにプロパティを作成します。
  • 上記の私の「3つの役に立つこと」を見てください、それらはすべてこの質問に当てはまります。
1
T.J. Crowder

私はJSコンパイルビジネスのエキスパートではありませんが、v8はconstフラグから利用することを意味します。

通常、多くの変数を宣言して変更した後、メモリが断片化し、v8が実行を停止し、数秒のうちにしばらく時間がかかり、gcまたはガベージコレクションが行われます。

ある変数がconst v8で宣言されている場合は、他のconst変数との間にある固定サイズのコンテナに入れても変化しません。型は変更されないため、そのデータ型に対する適切な操作も節約できます。

0
Jew

'const'は、識別子が再割り当てされないことをコードに示しています。これは、 'const'、 'let'、または 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#)を使用する場合についてのよい記事です。 ukgxpfhao

0
Ananda