let 和 const是JavaScript自ES2015 起引入的,这两个关键字在 JavaScript 中提供了块作用域(Block Scope)变量(和常量)。在 ES2015 之前,JavaScript 只有两种类型的作用域:全局作用域和函数作用域。本篇主要说一下let 和 const有什么不同之处。
const 与 let 很类似,都有相同的块作用域,唯一区别就在于 const 声明的是一个只读变量,声明之后不允许改变其值。因此,const 一旦声明必须初始化,否则会报错。对么如何理解这个只读的常量呢?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动(即栈内存在的值和地址)。JavaScript 的数据类型分为两类:原始值类型和对象(Object类型)。对于原始值类型(undefined、null、true/false、number、string),值就保存在变量指向的那个内存地址(在栈中),因此 const 声明的原始值类型变量等同于常量。
对于对象类型(object,array,function等),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是不可修改的,至于指针指向的数据结构是无法保证其不能被修改的(在堆中)。
相关阅读
- JavaScript 获取时间戳的几种方法对比与使用场景
- 完美的判断页面是否有滚动条|JS 判断思路与实现代码
- JS parseInt 的进制陷阱:默认解析规则与安全用法建议
- JavaScript 前一天 本月最后一天|日期计算常用写法