摘要:在本教程中,您将学习如何使用 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
关键字声明了一个名为 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 循环中不起作用。尝试使用 const
关键字在命令式 for
循环中声明变量会导致 TypeError
for (const i = 0; i < scores.length; i++) { // TypeError
console.log(scores[i]);
}
Code language: JavaScript (javascript)
原因是声明只在循环体开始之前评估一次。
摘要
const
关键字创建对值的只读引用。只读引用不能重新分配,但可以更改值。- 用
const
关键字声明的变量是块级作用域的,不能重新声明。