• js 对象的值传递


    一、变量赋值的不同

    1、原始值

    在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的。

     

    2、引用值:

    在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,

    也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。

     

     

    二、参数传递的不同

    首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。但是为什么涉及到原始类型与引用类型的值时仍然有区别呢,就是因为内存分配时的差别。

    • 原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
    • 引用值:对象变量它里面的值是这个对象在堆内存中的内存地址!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了。


    三、对象的值传递

    • 改变对象内存地址:如果参数赋值另一个对象时,这个参数就会更改它的值为新对象的内存地址指向新的对象,此时与原对象相互独立;
    • 改变对象的内部属性:如果这个参数是改变对象内部的属性的话,这个改变会体现在外部,因为他们共同指向的这个对象被修改了!
    var obj1 = {value:'111'};
    var obj2 = {value:'222'};
    function changeStuff(obj){
      // 实际上这里简写一步obj = obj1;而不是将obj直接看成obj1
      obj.value = '333';    //
      obj = obj2;    //
      return obj.value;
    }
    var foo = changeStuff(obj1);
    console.log(foo);   // '222' 参数obj指向了新的对象                                     
    console.log(obj1.value);  // '333' 

    解析:

    ①将obj1的对象地址复制给obj,这样,obj和obj1共同指向一个对象地址!

    同时改变obj的value属性(obj.value=333),obj1的value值也随着改变(obj1.value=333)!

    ②将obj2的对象地址复制给obj,obj指向obj2的对象地址。obj.value=222)

  • 相关阅读:
    vim/gvim使用笔记
    WebStorm for Mac (PyCharm)- 破解注册激活版下载
    volatile 关键字
    vue页面在加载的时候闪烁花括号{{}} 解决非工程化项目初始化页面闪动问题
    Element-ui el-table表格 排序图标刷新后不见问题
    与运算(&)、或运算(|)、异或运算(^)
    JS中 二进制与十进制的相互转换
    报告大家好消息,我找到新工作了
    公众号基本配置 token 验证失败,成功解决
    asp.net core 5.0,怎么山寨了koa2?
  • 原文地址:https://www.cnblogs.com/minigrasshopper/p/8056816.html
Copyright © 2020-2023  润新知