对象的引用地址 堆内存 简单理解

92 阅读2分钟

对象

  • 复杂数据类型会将数据本体存在堆内存中,变量名存储在堆内存中,变量名内部存储着指向堆内存的地址

       var obj={
              a:1,
              b:2,
              c:3,
              d:4,
              e:5,
              f:6,
              g:7,
              h:8
             }
    
          console.log(obj)
          console.log(obj.a);
          console.log(obj.h);
    
          obj.a=10;
          obj.h=100;
          
          
         // 当获取obj时,就会根据这个变量存储的引用地址,
         在堆中查找到地址所对应的对象,并且调用该对象的结果
         
         将obj中引用地址赋值给了o1这个变量
         这种情况会将对象共有给o1,也就是说o1和obj共有一个对象,
         当修改任何变量所对应的属性值时,相当于直接修改了该对象
         相对的变量获取的这个对象也是改变的
           var o1=obj;
           o1.b=100;
           console.log(obj.b);
           
           
    

对象引用地址的运用

 例子1
    var o1={a:1,b:2};
    var o2=o1;

    重新设置了o1的新的引用地址,不会改变o2的引用地址
    o1={c:3,d:4};
    console.log(o2);// {a: 1, b: 2} 
    
    
  例子2   
     var o1={a:1};
     var o2=o1;

     o2.a=10;
     console.log(o1.a);//10  因为o1和o2是同一个引用地址,
                             改变o2的属性打印o1时,就会得到同样改变后的属性值
   例子3                              
     var o1={a:1};
     var o2=o1;

     o1={b:2}; //重新设值改变地址
     console.log(o1.a);//undefined   
     console.log(o2.a);//1 没有改变
     console.log(o2.b);//undefined
     
   例子4 
    修改了o1.b的属性,给b设置为一个对象,o2也就会有b这个属性
    var o1={a:1};
    var o2=o1;
    o1.b={a:3};

    console.log(o2);//{a:1,b:{a:3}}
    
   例子5
    var o1={a:1};
    var o2=o1;
    o1=o1.b={b:10};                   //同时赋值  一个是给o1的引用地址下面的b属性赋值,
                                       一个是给o1这个变量重新赋值一个新地址
    console.log(o2,o1);
    o2 {a:1,b:{b:10}} // 旧地止里面的一个属性改了。
    o1 {b:10} //新地址

内存泄漏

    var o={a:1};
    o={a:10}; //重新设个引用地址

    {a:1} 这个对象仍然会在堆中继续存在 流浪的孤儿 孤儿对象
    当产生大量孤儿对象,而且还在实时的生成新的孤儿对象。而这些孤儿对象没有得到释放,就叫做内存泄漏


    var o={a:1};
    o=null;
    o={a:2};

    系统中有一个垃圾回收机制 
    当给o设置为null,堆中的这个对象认为自身的引用关系被瓦解了,没有别的变量引用自己,垃圾回收车过去的时候就会回收
    null主要用于接触对象的引用关系


    var o={a:1};
    var o1=o;

    o=null;
    o={a:10};
    因为o1还在引用这个{a:1}的引用地址,所以不会因为o设置为null,被回收
    如果想要回收必须将两个变量都设置为null