es6 では、const キーワードを使用して読み取り専用定数を宣言できます。構文は「const 定数名 = 定数値;」です。宣言後は定数を初期化する必要があり、初期化された値は変更できません。 const によって宣言された定数はブロック スコープに属し、「一時的なデッド ゾーン」の対象となり、ウィンドウ上にグローバル プロパティは作成されず、再割り当てや再宣言はできません。
このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。
es6 では、const キーワードを使用して読み取り専用定数を宣言できます。
es6 const キーワード
const は読み取り専用の定数を宣言します。宣言した定数は初期化する必要があり、初期化された値は変更できません。
const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable.
const 定数は次の規則に従います:
はブロック スコープに属します。
は「一時的なデッドゾーン」の対象となります。
ウィンドウ上にグローバル プロパティは作成されません。
再割り当てはできません。
再宣言することはできません。
const 変数を宣言したら、すぐに初期化する必要があります。
const foo; // SyntaxError: Missing initializer in const declaration
上記のコードは、const の場合、値を割り当てずに宣言しただけの場合、エラーが報告されることを示しています。
const のスコープは let コマンドのスコープと同じです。const が宣言されているブロックレベルのスコープ内でのみ有効です。
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
const コマンドで宣言された定数は昇格されません。一時的なデッド ゾーンもあり、宣言された位置の後でのみ使用できます。
if (true) { console.log(MAX); // ReferenceError const MAX = 5; }
上記のコードは、定数 MAX が宣言される前に呼び出され、エラーが報告されます。
const で宣言した定数は let のように繰り返し宣言することはできません。
var message = "Hello!"; let age = 25; // 以下两行都会报错 const message = "Goodbye!"; const age = 30;
const の本質
const が実際に保証しているのは、変数の値が変更できないことではなく、メモリ アドレスに格納されているデータがポイントしていることです。変数によって変更することはできません。単純なタイプのデータ (数値、文字列、ブール値) の場合、値は変数が指すメモリ アドレスに格納されるため、定数と同等です。しかし、複合型データ (主にオブジェクトと配列) の場合、変数が指すメモリ アドレスには実際のデータへのポインタが格納されるだけであり、const はこのポインタが固定されていること (つまり、常に別の固定アドレスを指していること) のみを保証できます。 、それが指すデータ構造が可変であるかどうかについては、完全に制御不能です。したがって、オブジェクトを定数として宣言するときは細心の注意を払う必要があります。
const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only
上記のコードでは、定数 foo はオブジェクトを指すアドレスを格納します。不変なのはこのアドレスのみです。つまり、foo が別のアドレスを指すことはできませんが、オブジェクト自体は変更可能であるため、新しいプロパティをオブジェクトに追加することはできます。
これは別の例です。
const a = []; a.push('Hello'); // 可执行 a.length = 0; // 可执行 a = ['Dave']; // 报错
上記のコードでは、定数 a は配列です。配列自体は書き込み可能ですが、別の配列を a に代入するとエラーが報告されます。
本当にオブジェクトをフリーズしたい場合は、Object.freeze メソッドを使用する必要があります。
const foo = Object.freeze({}); // 常规模式时,下面一行不起作用; // 严格模式时,该行会报错 foo.prop = 123;
上記のコードでは、定数 foo は凍結されたオブジェクトを指しているため、新しい属性の追加は機能せず、厳密モードではエラーが報告されます。
オブジェクト自体をフリーズするだけでなく、オブジェクトのプロパティもフリーズする必要があります。以下はオブジェクトを完全にフリーズする関数です。
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } }); };
【関連する推奨事項: JavaScript ビデオ チュートリアル 、プログラミング ビデオ ]
以上がes6 で読み取り専用定数を宣言する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。