【ES6 教程】第一章 新的ES6語(yǔ)法03—使用const 關(guān)鍵字定義常量

英文 | https://www.javascripttutorial.net
翻譯 | 楊小愛
在本教程中,我們將學(xué)習(xí)如何使用 JavaScript const 關(guān)鍵字定義常量。
JavaScript const 關(guān)鍵字簡(jiǎn)介
ES6 提供了一種使用 const 關(guān)鍵字聲明常量的新方法。const 關(guān)鍵字創(chuàng)建對(duì)值的只讀引用。
const CONSTANT_NAME = value;
按照慣例,常量標(biāo)識(shí)符是大寫的。
與 let 關(guān)鍵字一樣, const 關(guān)鍵字聲明塊作用域變量。但是,由 const 關(guān)鍵字聲明的塊范圍變量不能重新分配。
let 關(guān)鍵字聲明的變量是可變的。這意味著我們可以隨時(shí)更改它們的值,如以下示例所示:
let a = 10;a = 20;a = a + 5;console.log(a); // 25
但是,由 const 關(guān)鍵字創(chuàng)建的變量是“不可變的”。換句話說(shuō),我們不能將它們重新分配給不同的值。
如果我們嘗試重新分配由 const 關(guān)鍵字聲明的變量,我們將收到如下所示的 TypeError:
const RATE = 0.1;RATE = 0.2; // TypeError
與 let 關(guān)鍵字不同,我們需要將值初始化為 const 關(guān)鍵字聲明的變量。
以下示例由于缺少 const 變量聲明中的初始化程序而導(dǎo)致 SyntaxError:
const RED; // SyntaxError
JavaScript 常量和對(duì)象
const 關(guān)鍵字確保它創(chuàng)建的變量是只讀的。但是,這并不意味著 const 變量引用的實(shí)際值是不可變的。例如:
const person = { age: 20 };person.age = 30; // OKconsole.log(person.age); // 30
即使 person 變量是一個(gè)常量,我們也可以更改其屬性的值。
但是,我們不能像這樣為 person 常量重新分配不同的值:
person = { age: 40 }; // TypeError
如果我們希望 person 對(duì)象的值是不可變的,則必須使用 Object.freeze() 方法將其凍結(jié):
const person = Object.freeze({age: 20});person.age = 30; // TypeError
注意 Object.freeze() 是淺的,這意味著它可以凍結(jié)對(duì)象的屬性,而不是屬性引用的對(duì)象。
例如,company 對(duì)象是不變的并且是凍結(jié)的。
const company = Object.freeze({name: 'ABC corp',address: {street: 'North 1st street',city: 'San Jose',state: 'CA',zipcode: 95134}});
但是 company.address 對(duì)象不是不可變的,我們可以向 company.address 對(duì)象添加一個(gè)新屬性,如下所示:
company.address.country = 'USA'; // OK
JavaScript 常量和數(shù)組
示例如下:
const colors = ['red'];colors.push('green');console.log(colors); // ["red", "green"]colors.pop();colors.pop();console.log(colors); // []colors = []; // TypeError
在此示例中,我們使用 const 關(guān)鍵字聲明了一個(gè)包含一個(gè)元素的數(shù)組 colors。然后,我們可以通過(guò)添加green來(lái)更改數(shù)組的元素。但是,我們不能將數(shù)組colors重新分配給另一個(gè)數(shù)組。
for 循環(huán)中的 JavaScript const
ES6 提供了一個(gè)名為 for...of 的新結(jié)構(gòu),它允許我們創(chuàng)建一個(gè)循環(huán)遍歷可迭代對(duì)象,例如數(shù)組、映射和集合。
let scores = [75, 80, 95];for (let score of scores) {console.log(score);}
如果你不打算在循環(huán)中修改 score 變量,你可以使用 const 關(guān)鍵字來(lái)代替:
let scores = [75, 80, 95];for (const score of scores) {console.log(score);}
在此示例中,for...of 在每次循環(huán)迭代中為 const 關(guān)鍵字創(chuàng)建一個(gè)新綁定。換句話說(shuō),每次迭代都會(huì)創(chuàng)建一個(gè)新的分?jǐn)?shù)常數(shù)score。
請(qǐng)注意, const 在命令式 for 循環(huán)中不起作用。嘗試使用 const 關(guān)鍵字在命令式 for 循環(huán)中聲明變量將導(dǎo)致 TypeError:
for (const i = 0; i < scores.length; i++) { // TypeErrorconsole.log(scores[i]);}
原因是,聲明只在循環(huán)體開始之前被評(píng)估一次。
總結(jié)
const 關(guān)鍵字創(chuàng)建對(duì)值的只讀引用。只讀引用不能重新分配,但值可以更改。
const 關(guān)鍵字聲明的變量是阻塞范圍的,不能重新聲明。
推薦閱讀
【ES6 教程】第一章 新的ES6語(yǔ)法01—let:使用let關(guān)鍵字聲明塊范圍的變量
【ES6 教程】第一章 新的ES6語(yǔ)法02—var 和 let 的區(qū)別
學(xué)習(xí)更多技能
請(qǐng)點(diǎn)擊下方公眾號(hào)
![]()

