在本教程中,您将学习如何使用 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 关键字声明的变量是块级作用域的,不能重新声明。