• javaScript 原始值和引用值的问题


    原始值和引用值

    javaScripyou两种类型的值

    stack 栈:原始数据类型(Undefined,Null,Boolean,Number、String)
              因为原始值占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈(stack)中,栈内存之间的赋值是拷贝,只是一个副本,改变互不影响.
    
    heap 堆:引用数据类型(Array, Oject, function....date ,RegExp)
            由于复杂值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此其存储在堆(heap)中,存储在变量处的值是一个指针,指向存储对象的内存处 引用值之间的拷贝是地址.
    
    
    

    存储方式

    原始值是不可以被改变的,var a = 10; a = 5;改变的是:重新建立一个存储区域,原来的值依然存在,只是地址 和 值之间的链接断了.

    原始值和引用值引发的问题

    1. 拷贝问题
    浅层拷贝
    function shallowCopy(Target, Origin){
    	for(var prop in Origin){
    		Target[prop] = Origin[prop]
    	}
    	return Target;
    }
    
    var obj = {
    	"name" : "ATM",
    	"card" : [1,1,1,2,5,2]
    }
    var obj1 = {};
    
    
    shallowCopy(obj1, obj);
    console.log(obj);// {"name" : "ATM","card" : [1,1,1,2,5,2]}
    obj1.card.push(7);
    console.log(obj1);// {"name" : "ATM","card" : [1,1,1,2,5,2,7]}
    console.log(obj);// {"name" : "ATM","card" : [1,1,1,2,5,2,7]}
    
    
    ~显然这不是我们想要的结果,如果对obj1对象进行改变,obj也会随着改变.
    

    上面代码就是一个浅层拷贝,将对象obj的值拷贝到对象'obj1'中,但是'obj'中有一个是属性'card'是一个引用值,引用值的 是存放到堆(heap)中的,obj1 拷贝的只是引用值在 中的 ** 地址**,就会出现以下情况:

      var father = [1, 3 , 5];
      var son = [];
    
      son = father;
      console.log(son); // [1, 3, 5]
    
    
      son.push(8);
      console.log(son); //[1, 3, 5, 8]
      console.log(father); //[1, 3, 5, 8]
    
      son = [1,5];//son在堆中开辟了一个新的房间.
      console.log(son); //[1, 5]
      console.log(father) //[1, 3, 5, 8]
    
    
    
    深度拷贝
      function deepCopy(Target, Origin){
        var Target = Target || {},
            toStr = Object.prototype.toString,
            str = "[object Array]";
            for(var prop in Origin){
              if(Origin.hasOwnProperty(prop)){
                if (typeof(Origin[prop]) !== null && typeof(Origin[prop]) =="object") {
                    if(toStr.call(Origin[prop]) == str){
                        Target[prop] = [];
                    }else{
                      Target[prop] = {};
                    }
                  deepCopy(Target[prop], Origin[prop]);
                }else{
                  Target[prop] = Origin[prop];
                }
              }
            }
            return Target;
      }
    
    
      var obj = {
        "name" : "fanwenbo",
        "card" : [1,2,3,4,5]
      };
    
      var obj1 = {};
    deepCopy(obj1,obj);
    
    
    遇到挫败,要学会左手温暖右手,相信明天会更好,after all,tomorrow is another day,满怀希望的活下去,不放弃学习,不放弃努力,forever youthful,forever weeping!!
  • 相关阅读:
    合并区间
    编译与运行
    传递信息
    划分字母区间
    无重叠区间
    用最少数量的箭引爆气球
    根据身高重建队列
    二叉树展开为链表
    动态添加按钮
    基础知识
  • 原文地址:https://www.cnblogs.com/lakemonster/p/9709448.html
Copyright © 2020-2023  润新知