myfreax

JavaScript ES6 const 声明常量

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

JavaScript ES6 const 声明常量
JavaScript ES6 const 声明常量

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

内容导航