美文网首页
引用类型&对象拷贝

引用类型&对象拷贝

作者: yuhuan121 | 来源:发表于2017-08-20 11:53 被阅读0次

    基本类型、引用类型

    基本类型值(数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
    引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,由该位置保存对象。
    注意基本类型和引用类型的区别:

    var a = 1
    var b = a
    a = 2
    b = 1//不改变b的值
    
    var obj = {age : 100 }
    var obj2 = obj
    obj.age = 200
    obj2.age = 200 //引用类型 对象的名称可以看作是指向它真实内容的地址
    

    函数的参数传递

    函数的参数传递

    对象浅拷贝和深拷贝

    浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

    • 对于基本数据类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是:两个对象指向同一块内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变。
    • 而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
    //浅拷贝
      var obj = {
      age: 100,
      friend: {
        name: 'ruoyu',
        sex: 'male',
        child: {
          name: 'abc'
        }
      }
    }
    function shallowCopy(obj){
      var newObj ={}
      for(var key in obj){
        if(obj.hasOwnProperty(key)){
          newObj[key] = obj[key]
        }
      }
      return newObj
    }
    
    var obj2 = shallowCopy(obj)
    
    //深拷贝
    var obj = {
      age: 100,
      friend: {
        name: 'ruoyu',
        sex: 'male',
        child: {
          name: 'abc'
        }
      }
    }
    
    function deepCopy(obj){
      var newObj ={} //新开辟一片空间,名字叫做newObj 
      for(var key in obj){
        if(obj.hasOwnProperty(key)){
          if(typeof obj[key] === 'number' || typeof obj[key] === 'boolean' || typeof obj[key] === 'string' || obj[key] === undefined || obj[key] === null){
            newObj[key] = obj[key]
          }else{
            newObj[key] = deepCopy(obj[key])
          }
        }
      }
      return newObj
    }
    
    var obj3 = deepCopy(obj)  
    

    相关文章

      网友评论

          本文标题:引用类型&对象拷贝

          本文链接:https://www.haomeiwen.com/subject/nclihxtx.html