ES3声明常量,采用大写,但意义不大,不严谨。
很明显BASE_URL发生变化了,所以不算常量,不唯一。
ES5声明常量
两次控制台输出es都是es6,所以这个方法可以声明常量
ES6采用const关键字来声明常量
报错证明这是个常量(唯一的),因为它不允许被重新赋值(切记能重新赋值的是变量)
const关键字其他错误用法:
(1)
这说明如果你用const关键字一开始只想做个声明,但不给它赋初始值也是不允许的。
(2)
这说明const关键字不允许重复声明,只能用一次,它不会像let和var关键字,重复声明会覆盖掉前面一个值。
(3)
const关键字不属于顶层对象window
(4)
const关键字不允许变量提升这种情况。
拓展:什么是变量提升?
这乍一看,好像变量还没有声明,控制台就着急就直接输出了。
真的是这样吗?
它其实相当于这样子:
(5)续
陷入暂时性死区,同样不允许常量还没有被声明就直接输出。记住我们JS是自上而下的执行机制。
(6)
我们对比看下const关键字下的块级作用域。
{}大括号就是形成了块级作用域,const关键字声明的作用域范围是局限于{}大括号里面,console.log(str)在{}外面输出是无效的。
const关键字总结,区别于变量var和let
consts声明的常量真的不可以改变吗?其实是可以改变的,那const关键字声明常量的本质到底是什么?接下来让我们慢慢一起来,那就上代码吧。
不是说const定义的常量是唯一,不会变的吗?怎么现在又变了?
Object对象会这样,我们看下另一种数组的情况。
在const定义常量的情况下,看来数组也不是唯一,和对象一样都会被改变。
通过这两个例子,我们发现了什么?
基本数据类型:number,布尔,字符串等,它们都属于栈内存。
对于对象和数组来说,他们的存储地址(或空间)是没有发生变化的,变的是他们的存储内容的不同。
这样一看,他们都是把内容替换掉了,地址栏没有换掉。
关于const定义指向对象图解。
所以在对象和数组这种情况下,const定义的常量不唯一。
那对象和数组就成为了const的漏网之鱼了吗,非也,那怎么在对象和数组的这种情况下,一定要让const定义的常量变成唯一的呢?有方法的哦!
(1)对象
在Object.freeze()方法下,name属性没有被改为es2015,这证明了const定义常量是唯一了。
(2)数组
数组也一样的。
(3)对象里面嵌套数组的情况。
又被改掉了,又不唯一了,看来Object.freeze()方法也不好使。
其实这是因为Object.freeze()方法是浅层次的冻结,冻结的是第一层,深层次不会被冻结掉。想要冻结深层次,就要封装一个函数递归冻结。
方法如下:
变成唯一了。