• js里面有引用传递吗?


    一:什么是引用传递

    引用传递是相对于值传递的。那什么是值传递呢?值传递就是在传递过程中再复制一份,然后再赋值给变量,例如:

    let a = 2;
    let b = a;
    
    • 1
    • 2

    在这个代码中,let b = a; 就是一个值传递,首先它将a的值复制下来,再赋值给b,最终这里的 a 和 b 指向的是两块儿内存空间;那什么又是引用传递呢?引用传递就是两个变量没有独立的内存空间,它们指向的是同一块儿内存空间。

    二:js里面有引用传递吗?

    结论:在es6模块化之前,js是没有严格意义上的引用传递的。

    有人可能会说,怎么会没有呢,赋值对象的时候不是用的引用传递吗?事实上,js里面赋值对象时同样是值传递,代码如下:

    let a = {
    	num: 0
    }
    let b = a;
    b.num = 2
    console.log(a.num)   // 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    以上代码看上去好像 a 和 b 指向的同一块儿地址,修改了 b 以后 a 也改了,但是这其实不是引用传递。我们都知道,js存储对象时,真实数据都存储在栈里面,a的值其实是一个指向对象的地址,而执行 let b = a;时,其实是将a存储的地址复制了一份给b,看起来是修改的 b 的值,其实修改的是b指向的栈里面的值,而 a 也指向这个空间,所以 a.num 变化了,但是对于a和b本身是没有影响的。而如果是引用传递,那么当我执行 b = 2 时,a也会等于2,这才是二者指向同一块儿空间。

    三:哪里有引用传递

    引用传递在es6之前时完全没有的,在es6中,只有在模块化的时候的 export 和 import 是用的引用传递,代码如下:

    export let a = 1;
    setTimeout(()=>{
    	a = 2;
    },1000)
    
    • 1
    • 2
    • 3
    • 4

    这个代码很简单,就是到处一个a的变量,并且在1秒后改变它的值,按照一般的想法来看,这个修改应该是不会影响到其他导入这个a的文件的,但是事实上,它是会修改的,代码如下:

    import { a } from 'xxx'
    console.log(a);   // 1
    setTimeout(()=>{
    	console.log(a)  // 2
    },1500)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    最后的结果如下,在这个文件里面改了a的值以后,也影响到了其他导入的文件
    打印结果

    四:作用

    讲了这么多,那这个东西有什么用吗?这东西用处不大,就有一点需要注意,就是当多个敌方都引用一个的时候,一个地方修改了,其他地方都会修改,偶尔可能会导致一些bug出现

  • 相关阅读:
    CSRF +self xss的运用【DVWA测试】
    详解TCP为什么不能是两次握手
    LLC谐振变换器软启动过程分析与问题处理
    flutter系列之:构建Widget的上下文环境BuildContext详解
    C/S架构学习之基于TCP的本地通信(客户机)
    偶然升职的内心独白
    【C++ Efficiency】使用运算符的复合形式取代其单独形式,效率更高
    基于数字孪生的车路协同虚拟仿真平台研究
    [JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏
    理解Python装饰器
  • 原文地址:https://blog.csdn.net/brilliantSt/article/details/136300491