码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 为了代码简洁性,引起值类型和引用类型赋值的错误说明


    先看以下代码:
    我们先声明一个变量

    let a = { b:1,c:{d:2}}
    
    • 1

    执行以下代码:

    if (情况一) {
      a.b = 3
    }
    if (情况二) {
      a.b = 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    有时我们为了代码的简洁性,会把代码优化成以下这样:

    let variable = a.b
    if (情况一) {
      variable = 3
    }
    if (情况二) {
      variable = 4
    }
    console.log(a) // 发现a里的b没变
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们执行这个简洁版代码之后,发现a里的b没有变,到底为什么呢?我们再继续看下以下代码:

    let variabl1 = a.c
    if (情况一) {
      variable1.d = 3
    }
    if (情况二) {
      variable1.d = 4
    }
    console.log(a) // 发现a里的c对象里的d发生变化
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    综合以上,我们发现a对象里的b是值类型,c是引用类型,当我们声明一个值类型的变量时,JavaScript会为其分配一块内存,用来存储该变量的值。当我们对该变量进行赋值时,JavaScript会将该值复制到新的内存空间中,并将新的内存地址赋给变量。

    这意味着,每个值类型的变量都有自己独立的内存空间,它们之间互不影响。当我们修改一个值类型的变量时,实际上是在修改其所对应内存空间中的值,而其他变量仍然引用原来的值。

    因此,在对值类型进行赋值、传递参数或返回值时,都是进行了一次浅拷贝,即将值复制到新的内存空间中,并且新的变量仍然是一个独立的值类型。

    相比之下,引用类型在赋值时,只是将内存地址复制给了新的变量,而并没有为该变量创建新的内存空间。这意味着,多个变量指向同一块内存空间,它们共享同一个值。

    如果我们对引用类型进行复制,只进行了一次浅拷贝,此时新的变量和原变量仍然引用同一个对象,当我们修改其中一个变量所指向的对象时,其他变量也会受到影响。因此,如果我们想要分开操作多个变量则需要进行深度克隆,创建一个新的对象并将其属性复制到新的对象中,以确保变量之间的独立性。

    所以,我们有时不能一脑子想着代码简洁性,要懂得其中的原理,否则bug是躲不过的

  • 相关阅读:
    安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)
    java-php-python-ssm随心淘网管理系统计算机毕业设计
    【实践】随机森林算法参数解释及调优(含Python代码)
    【Docker】Linux网络命名空间
    Java多线程篇(11)——BlockingQueue(优先级阻塞,延迟队列)
    五面阿里巴巴回来分享面经总结,定级P7架构师
    OpenGL运行环境的搭建(GLFW+GLAD+OpenGL以及在Vistual Studio中的 配置)
    如何开通 chatGPT4 会员
    Golang学习之路6-goroutine并发
    【华为OD机试真题 python】数据分类【2022 Q4 | 200分】
  • 原文地址:https://blog.csdn.net/weixin_44233892/article/details/132733508
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号