前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS 这次真的可以禁止常量修改了!🥊

JS 这次真的可以禁止常量修改了!🥊

作者头像
德育处主任
发布2022-09-02 11:00:01
2.5K0
发布2022-09-02 11:00:01
举报

本文简介

ES6 推出的 const 可以定义常量。在 JS 中,常量是不可改变的。这个 “不可改变” 指的是常量存放的内存地址不变。

众所周知,使用 const 定义的常量,如果是基础类型的数据,值不能变。但如果是引用类型的数据(比如对象、数组等),是可以修改里面的元素。所以有时候看上去常量并不那么“常量”。

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

“可变” 的常量

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

JS 的基础类型数据存在 栈内存 里;引用类型数据存在 堆内存 里。但引用类型的数据,比如对象,对象的 key 是存到栈内存 里,栈内存 中存放了一个引用地址,这个引用地址指向存放在 堆内存 的值。

所以用 const 创建一个对象常量时,只要不改变 引用地址 就不会报错。

举个例子

代码语言:javascript
复制
const obj = {
    name: '雷猴'
}

obj.name = '鲨鱼辣椒'

console.log(obj) // 输出: {name: '鲨鱼辣椒'}
复制代码

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

冻结对象

如果要将 const 创建的对象设置为不可变,可以使用 Object.freeze

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

代码语言:javascript
复制
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 只能 “浅层冻结” ,如果对象的某个属性也是对象,那就冻不住了。

如果要冻结深层次对象,可以用递归来操作。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文简介
  • “可变” 的常量
  • 冻结对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档