一点就通JS参数传递之引用对象

6次阅读

共计 676 个字符,预计需要花费 2 分钟才能阅读完成。

JS 中所有参数传递都是值,不可能通过引用传递参数。


技术文章写的不够通俗易懂,和咸鱼有什么区别。


知识点:

  • JS 中所有参数传递都是传值
  • 对于对象等引用数据类型,“=”操作会覆盖掉原来的地址值。

直接看看“问题”代码:(相信一般情况你已经理解,是带着问题来的)

<script>
    var student = new Object()

    function addName(obj){
        obj.name = "zhang";
        
        obj = {};   // 或者任何重新为 obj 赋值的操作,如 obj = new Object();
        obj.name = "lisi";
    }

    addName(student)

    console.log(student.name);
</script>

是不是以为输出的 student.name 会是 ”lisi”?

那么废话少说,直接来干货(知识点):

看懂图,再来看代码:

  1. addName(student)调用函数,将 student 地址 (地址也是变量值) 传值给 obj;
  2. obj.name = “zhang”; 因为此时 obj 是copy 了一份地址,指向了堆内存中的 student 对象实例;
  3. 所以,此时 obj.name 操作的是 student 对象实例。
  4. (重点)

    ** 紧接着 obj = {}; 这里有个重要知识点:**
    ** 对于对象等引用数据类型,“=”操作会覆盖掉原来的地址值。**
    

    所以,obj = {}; 执行之后的 obj 重新指向了一个新的堆内存地址;也就是说,之后的 obj.name 等操作,都是在操作一个和 student 对象实例完全无关的对象。

总结:

  • JS 中所有参数传递都是传值
  • 对于对象等引用数据类型,“=”操作会覆盖掉原来的地址值。
正文完
 0