概要:このチュートリアルでは、JavaScriptのconst
キーワードを使って定数を定義する方法を学びます。
JavaScript const キーワード入門
ES6では、const
キーワードを使って定数を宣言する新しい方法が提供されています。const
キーワードは、値への読み取り専用の参照を作成します。
const CONSTANT_NAME = value;
Code language: JavaScript (javascript)
慣例として、定数識別子はすべて大文字で記述します。
letキーワードと同様に、const
キーワードはブロックスコープの変数を宣言します。ただし、constキーワードで宣言されたブロックスコープの変数は、再代入できません。
let
キーワードで宣言された変数は可変です。つまり、次の例に示すように、いつでも値を変更できます。
let a = 10;
a = 20;
a = a + 5;
console.log(a); // 25
Code language: JavaScript (javascript)
しかし、const
キーワードで作成された変数は「不変」です。言い換えれば、異なる値を再代入することはできません。
const
キーワードで宣言された変数に再代入しようとすると、次のようなTypeError
が発生します。
const RATE = 0.1;
RATE = 0.2; // TypeError
Code language: JavaScript (javascript)
letキーワードとは異なり、constキーワードで宣言された変数には値を初期化する必要があります。
次の例では、const
変数の宣言で初期化子が欠落しているため、SyntaxError
が発生します。
const RED; // SyntaxError
Code language: JavaScript (javascript)
JavaScript const とオブジェクト
const
キーワードは、作成する変数が読み取り専用であることを保証します。ただし、const
変数が参照する実際の値が不変であることを意味するわけではありません。例えば
const person = { age: 20 };
person.age = 30; // OK
console.log(person.age); // 30
Code language: JavaScript (javascript)
person
変数が定数であっても、そのプロパティの値を変更できます。
ただし、次のように、person
定数に異なる値を再代入することはできません。
person = { age: 40 }; // TypeError
Code language: JavaScript (javascript)
person
オブジェクトの値を不変にする場合は、Object.freeze()
メソッドを使用して凍結する必要があります。
const person = Object.freeze({age: 20});
person.age = 30; // TypeError
Code language: JavaScript (javascript)
Object.freeze()
は浅い凍結であることに注意してください。つまり、オブジェクトのプロパティを凍結できますが、プロパティが参照するオブジェクトを凍結することはできません。
たとえば、company
オブジェクトは定数であり、凍結されています。
const company = Object.freeze({
name: 'ABC corp',
address: {
street: 'North 1st street',
city: 'San Jose',
state: 'CA',
zipcode: 95134
}
});
Code language: JavaScript (javascript)
ただし、company.address
オブジェクトは不変ではなく、次のようにcompany.address
オブジェクトに新しいプロパティを追加できます。
company.address.country = 'USA'; // OK
Code language: JavaScript (javascript)
JavaScript const と配列
次の例を考えてみましょう。
const colors = ['red'];
colors.push('green');
console.log(colors); // ["red", "green"]
colors.pop();
colors.pop();
console.log(colors); // []
colors = []; // TypeError
Code language: JavaScript (javascript)
この例では、const
キーワードを使用して、要素が1つしかない配列colors
を宣言します。次に、green
色を追加して、配列の要素を変更できます。ただし、配列colors
を別の配列に再代入することはできません。
forループでのJavaScript const
ES6には、for...of
と呼ばれる新しい構文が用意されており、配列、マップ、セットなどの反復可能なオブジェクトを反復処理するループを作成できます。
let scores = [75, 80, 95];
for (let score of scores) {
console.log(score);
}
Code language: JavaScript (javascript)
ループ内でscore
変数を変更する予定がない場合は、代わりにconst
キーワードを使用できます。
let scores = [75, 80, 95];
for (const score of scores) {
console.log(score);
}
Code language: JavaScript (javascript)
この例では、for...of
は各ループ反復でconst
キーワードの新しいバインディングを作成します。言い換えれば、各反復で新しいscore
定数が作成されます。
const
は命令型forループでは機能しないことに注意してください。命令型for
ループで変数を宣言するためにconst
キーワードを使用しようとすると、TypeError
が発生します。
for (const i = 0; i < scores.length; i++) { // TypeError
console.log(scores[i]);
}
Code language: JavaScript (javascript)
その理由は、宣言はループ本体が開始される前に一度だけ評価されるためです。
まとめ
const
キーワードは、値への読み取り専用の参照を作成します。読み取り専用の参照は再代入できませんが、値を変更することはできます。- constキーワードで宣言された変数はブロックスコープであり、再宣言することはできません。