在本教程中,您将学习如何使用 JavaScript const 关键字定义常量。

JavaScript const 关键字介绍

ES6 提供一种使用 const 关键字声明常量的方法。const 关键字创建对值的只读引用。

const CONSTANT_NAME = value;

按照惯例,常量名称是大写的。与 let 关键字一样,const 关键字声明块级作用域变量。但是,由 const 关键字声明的块级作用域变量不能重新分配

let 关键字声明的变量是可变的。这意味着您可以随时更改它们的值,如以下示例所示:

let a = 10;
a = 20;
a = a + 5;
console.log(a); // 25

但是,const 关键字创建的变量是不可变的。换句话说,您不能将它们重新分配给不同的值。

如果您尝试重新分配 const 关键字声明的变量,您将得到类型错误 TypeError 。如下所示:

const RATE = 0.1;
RATE = 0.2; // TypeError

与 let 关键字不同,您需要将 const 关键字声明的变量的值初始化。下面的示例由于在 const 变量声明中缺少初始化而导致 SyntaxError

const RED; // SyntaxError

JavaScript 常量和对象

const 关键字确保它创建的变量是只读的。但是,这并不意味着 const 变量引用的实际值是不可变的。例如:

const person = { age: 20 };
person.age = 30; // OK
console.log(person.age); // 30

即使 person 变量是常量,您也可以更改其属性的值。但是,您不能像这样为常量person 重新分配不同的值:

person = { age: 40 }; // TypeError

如果您希望  person 对象的值不可变,则必须使用 Object.freeze() 方法冻结它:

const person = Object.freeze({age: 20});
person.age = 30; // TypeError

注意是Object.freeze() 浅复制,意味着它可以冻结对象的属性,而不会冻结属性所引用的对象。

例如,company 是已冻结的对象常量。

const company = Object.freeze({
    name: 'ABC corp',
    address: {
        street: 'North 1st street',
        city: 'San Jose',
        state: 'CA',
        zipcode: 95134
    }
});

但是 company.address 对象不是不可变的,你可以给 company.address 对象添加一个新的属性,如下所示:

company.address.country = 'USA'; // OK

JavaScript 常量和数组

考虑下面示例:

const colors = ['red'];
colors.push('green');
console.log(colors); // ["red", "green"]

colors.pop();
colors.pop();
console.log(colors); // []

colors = []; // TypeError

在此示例中,我们使用 const 关键字声明一个包含一个元素的数组 colors。然后,我们可以通过添加 green 颜色来更改数组的元素。但是,我们不能将数组 colors 重新分配给另一个数组。

JavaScript for循环中的 const

ES6 提供一个名为 for...of 的构造,它允许您创建循环并迭代可迭代对象,例如数组映射集合

let scores = [75, 80, 95];

for (let score of scores) {
	console.log(score);
}

如果您不打算修改循环内的 score 变量,则可以改用 const 关键字:

let scores = [75, 80, 95];
for (const score of scores) {
    console.log(score);
}

在此示例中,在每次 for...of 循环迭代中为 const 关键字创建一个新绑定。换句话说,每次迭代都会创建一个新常量 score

请注意,在命令式 for 循环中 const 将不起作用。尝试使用 const 关键字在命令式for 循环中声明变量将导致 TypeError

for (const i = 0; i < scores.length; i++) { // TypeError
    console.log(scores[i]);
}

原因是声明只在循环体开始前计算一次。

结论

const 关键字创建对值的只读引用。只读引用不能重新分配,但值可以更改。const 关键字声明的变量是块级作用域的,不能重新声明。