英文 | 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++) { // TypeErrorconsole.log(scores[i]);
}

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

总结

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

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

推荐阅读

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

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

学习更多技能

请点击下方公众号

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

  1. 【ES6 教程】第一章 新的ES6语法04—如何设置函数参数的默认值

    英文 | https://www.javascripttutorial.net 翻译 | 杨小爱 在本节教程中,我们将学习如何在 ES6 中处理 JavaScript 默认参数. TL;DR func ...

  2. 乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍(可供技术选型时使用)

    乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍 RabbitMQ介绍 1.RabbitMQ技术简介 2.RabbitMQ其他扩展插件 2.1监控工具rabbitmq-managemen ...

  3. excel工具栏隐藏了怎么办_Office2016基础教程第一章:认识Excel #excel #职场 #办公技巧...

    今日详讲Excel基础 教程 第一章:认识Excel 1. 版本兼容性 2. Excel2016的独特之处 3. 安装Excel2016 4. 启动Excel2016 5. 退出Excel2016 6 ...

  4. WEBGL 2D游戏引擎研发系列 第一章 新的开始

    WEBGL 2D游戏引擎研发系列 第一章 <新的开始> ~\(≥▽≤)/~HTML5游戏开发者社区(群号:326492427) 转载请注明出处:http://html5gamedev.or ...

  5. AArch64教程第一章

    AArch64教程第一章 AArch64是一个新的64位模式,它是ARMv8架构下的一部分,它于2011年随着ARM发布.它被逐步部署于智能手机和服务器.所以我认为现在学习一点关于此架构的知识是比较好 ...

  6. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了"删除& ...

  7. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt

    <北大青鸟C语言教程--第一章 C语言基础.ppt>由会员分享,可在线阅读,更多相关<北大青鸟C语言教程--第一章 C语言基础.ppt(20页珍藏版)>请在人人文库网上搜索. ...

  8. 乐行学院Redis5学习教程 第一章redis5的安装

    乐行学院Redis5学习教程 第一章redis5的安装 1.安装虚拟机 2.centeros下载 3.vmware安装centeros 4.vmware安装centeros设置IP 5.安装redis ...

  9. laravel教程 第一章安装laravel

    #laravel教程# ##第一章 安装laravel## ###前言 ### 有很多人,都在纠结于自己学什么框架,用什么框架.在这里我想告诉你,框架都是死的,但是人是活的,只要你明白的框架的基本原理 ...

最新文章

  1. Android谷歌地图服务开发注册流程及问题
  2. 区块链面试过程中的40个问题
  3. CF56E Domino Principle 树状数组 + 简单dp
  4. JavaEE实战班第十七天
  5. shell判断文件,目录是否存在或者具有权限 (转载)
  6. 【算法】—— str2int(正序和逆序)
  7. 其他进制转化为十进制 详解
  8. 几种数据可视化框架分析
  9. Android相同包名不同签名的apk安装失败问题分析
  10. 【解决】linux磁盘扩容大全:新增磁盘、原磁盘扩容、home分区root分区扩容
  11. 利用百度云存储制作外链mp3音乐地址
  12. 【矩阵论】范数和矩阵函数(2)
  13. 《缠中说禅108课》69:月线分段与上海大走势分析、预判
  14. Matlab如何绘制小提琴图?
  15. SMP、NUMA、MMP的简介
  16. PTA——基础编程题 | 7-27 冒泡法排序 (20分)
  17. 机械键盘轴的小知识详解
  18. 基于python高校学生管理系统
  19. 跻身全球前十,金山云欲用AIoT再破局
  20. python django怎么读_django的英文读法是什么

热门文章

  1. 猫群算法matlab实现,猫群算法仿生计算在图像聚类分析中的应用
  2. 5G工业路由器在无人机行业的应用
  3. centos安装pip工具
  4. 在线教育平台关于课程进度的处理方法
  5. 我的世界服务器pvp文件在哪,【1.8】【PVP】我的世界南城以南服务器
  6. 信息存储单位+常见数据类型
  7. 献给迷失的你—一名IT员工的职场心得
  8. 同步录音录像(审讯监控系统-远程提审系统-远程审讯系统)
  9. Mac系统下Pages如何使用多级目录
  10. 笔记/5个你现在可以使用的 ES2019 特性