【ES6 教程】第一章 新的ES6语法03—使用const 关键字定义常量

61a062a859a990d1a17d0f7ad315217e.png

英文 | https://www.javascripttutorial.net

翻译 | 杨小爱

在本教程中,我们将学习如何使用 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重新分配给另一个数组。

for 循环中的 JavaScript 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。

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

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

原因是,声明只在循环体开始之前被评估一次。

总结

  • const 关键字创建对值的只读引用。只读引用不能重新分配,但值可以更改。

  • const 关键字声明的变量是阻塞范围的,不能重新声明。

推荐阅读

【ES6 教程】第一章 新的ES6语法01—let:使用let关键字声明块范围的变量

【ES6 教程】第一章 新的ES6语法02—var 和 let 的区别

学习更多技能

请点击下方公众号

833d8844974f39788f371dd59656aa4e.gif

011e1c3b5fb2cac39201e735d1580513.png

92df0bc88fae6cd34d05f64c8c28af70.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值