zoukankan      html  css  js  c++  java
  • 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!!
  • 相关阅读:
    Bootstrap<基础十四> 按钮下拉菜单
    Bootstrap<基础十三> 按钮组
    Bootstrap <基础十二>下拉菜单(Dropdowns)
    Bootstrap<基础十一>字体图标(Glyphicons)
    Bootstrap<基础十> 响应式实用工具
    Bootstrap<基础九>辅助类
    Bootstrap <基础八>图片
    Bootstrap <基础七>按钮
    Bootstrap<基础六> 表单
    Bootstrap <基础五>表格
  • 原文地址:https://www.cnblogs.com/lakemonster/p/9709448.html
Copyright © 2011-2022 走看看