码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JS 这次真的可以禁止常量修改了!



    theme: smartblue

    本文简介

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

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

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

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

    “可变” 的常量

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

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

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

    举个例子

    ```js const obj = { name: '雷猴' }

    obj.name = '鲨鱼辣椒'

    console.log(obj) // 输出: {name: '鲨鱼辣椒'} ```

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

    冻结对象

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

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

    ```js 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也能监听数组变化?》

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

  • 相关阅读:
    【面试HOT100】链表&&树
    Flume集成Kafka
    面试官:SpringBoot如何优雅停机?
    B49 - 基于STM32单片机的心率血氧检测与远程定位报警装置
    .NET开发工作效率提升利器 - CodeGeeX AI编程助手
    docker login/logout 远程仓库登录认证删除
    Linux ARM平台开发系列讲解(PCIE) 2.13.3 PCI设备的访问方法(桥设备)
    代码随想录Day_52打卡
    IDEA 运行 ‘xxx‘ 时出错. 命令行过长. 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行.
    ES学习笔记
  • 原文地址:https://blog.csdn.net/weixin_39415598/article/details/125556589
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号