のべラボ.blog

謙虚に、臆せず、さぼらずにブログを書く

モダンなJavaScriptのお勉強:変数宣言編

これまでは、普通に var を使って変数宣言していましたが、ECMAScript 2015 で追加された letconst を使って、その違いを確認してみます。

var の場合

例えば、次のような宣言をしてみます。

var message = "Hello";

この変数 message は、値の変更がでます。変数だから当然と言えば当然かもですが。

message = "Hi";
console.log(message);

結果

Hi

また、同じ変数名で再度宣言することもできます。

var message = "ハロー";
console.log(message);

結果

ハロー

let の場合

letの場合は、値の変更は可能ですが、同じ変数名での再宣言は不可になります。

まず let で宣言します。

let message = "Hello";

その後、値を変更します。次のコードは正常に実行できます。

message = "Hi";
console.log(message);

結果

Hi

ただし、次のように再宣言するコードはSyntaxErrorになり、実行できません。

let message = "ハロー"; // SyntaxError
console.log(message);

const の場合

constは、値の変更も、同じ変数名での再宣言も不可になります。

いわゆる 定数 の扱いですね。

const で宣言してみます。

const message = "Hello";
console.log(message);

その後、値を変更します。次のコードはSyntax Errorにはなりませんが、実行時にエラーになります。

message = "Hi";
console.log(message);

発生したエラーは、TypeError: Assignment to constant variable でした。

また、let と同じく次のように再宣言するコードはSyntaxErrorになり、実行できません。

const message = "ハロー"; // SyntaxError
console.log(message);

const は、値の変更が不可という事がわかりましたが、1つ注意点があります。

値が不可なのは、文字列 ( String ) や 数値 ( Number) や 真偽 ( Boolean) などのプリミティブ型であり、オブジェクトのプロパティや配列の要素は変更できます。

オブジェクトのプロパティの例をみてみましょう。

次のコードは const でオブジェクトを宣言していますが、そのプロパティは変更可能です。

const member1 = {
     id: 1,
     name: "Neco",
     address: "Tokyo"
};
member1.address = "Osaka";
console.log(member1);

結果

{ id: 1, name: 'Neco', address: 'Osaka' }

配列の要素の例もみてみましょう。このコードでも const で宣言した配列の要素を変更しています。

const mode = ["PLAY", "STOP"]
mode.push("PAUSE");
console.log(mode);

結果

[ 'PLAY', 'STOP', 'PAUSE' ]

まとめ

var と違い、letconst は同じ変数名での再宣言は不可であることがわかりました。

再宣言は、コードが混乱する元になりがちなので、基本的に letconst での変数宣言が良さそうです。

また、letconst の使い分けは、変数として扱うか、定数として扱いかで考えればいいですね。