本文简介

点赞 + 关注 + 珍藏 = 学会了


ES6 推出的 const 能够定义常量。在 JS 中,常量是不可扭转的。这个 “不可扭转” 指的是常量寄存的内存地址不变。

家喻户晓,应用 const 定义的常量,如果是根底类型的数据,值不能变。但如果是援用类型的数据(比方对象、数组等),是能够批改外面的元素。所以有时候看上去常量并不那么“常量”。


但咱们还是有方法让常量变成真正的 “常量”。


“可变” 的常量

内存分为 栈内存(stack)堆内存(heap)

JS 的根底类型数据存在 栈内存 里;援用类型数据存在 堆内存 里。但援用类型的数据,比方对象,对象的 key 是存到栈内存 里,栈内存 中寄存了一个援用地址,这个援用地址指向寄存在 堆内存 的值。

所以用 const 创立一个对象常量时,只有不扭转 援用地址 就不会报错。

举个例子

const obj = {    name: '雷猴'}obj.name = '鲨鱼辣椒'console.log(obj) // 输入: {name: '鲨鱼辣椒'}

有没有感觉下面的代码看上去并不那么 “常量” ?



解冻对象

如果要将 const 创立的对象设置为不可变,能够应用 Object.freeze

freeze 就有解冻的意思。它会将一个一般对象转化为一个不可变对象,也就是说 不能为这个对象增加新的属性、删除已有属性,也不能批改已存在的属性

const obj = {  nickname: '雷猴',  skill: {    name: '凌波微步',    describe: '跑不快的,没啥用的功夫'  }}// 浅层解冻Object.freeze(obj)obj.nickname = '鲨鱼辣椒'console.log(obj.nickname) // 输入: 雷猴obj.skill.name = '大象踢腿'console.log(obj.skill) // 输入: {name: '大象踢腿', describe: '跑不快的,没啥用的功夫'}

Object.freeze 只能 “浅层解冻” ,如果对象的某个属性也是对象,那就冻不住了。

如果要解冻深层次对象,能够用递归来操作。



举荐浏览

《JS ES5也能够创立常量?》

《Object.defineProperty也能监听数组变动?》

《Object.defineProperty也能监听数组变动?》

《Object.defineProperty也能监听数组变动?》

《Object.defineProperty也能监听数组变动?》

《Object.defineProperty也能监听数组变动?》


点赞 + 关注 + 珍藏 = 学会了

点赞 + 关注 + 珍藏 = 学会了