前置知识:

常用数据类型:
基本类型:String/Number/Boolean/Null/Undefined
引用类型:Function/Object/Array
知悉:var a =123 => 左边的常量a为栈,右边的123为堆,栈指向堆

概念:

浅拷贝:就是创建一个新对象,这个对象对原来对象的属性值记性一份拷贝

如果属性是基本类型,拷贝的就是基本类型的值

如果属性是引用类型,拷贝的就是内存地址

深拷贝:将一个对象从内存中完整的拷贝一份出来,堆内存开辟一个新的区域存放新对象,
且修改新对象不会影响原对象

浅拷贝和赋值的区别

var person={

name:“爱就一个字”,

hobby:['学习',['看电影','购物'],'跑步'],

date:new RegExp('\\w+')

function(){}

}

赋值:
当我们把一个对象赋值给一个新的变量值时,赋的其实是该对象在栈中的地址,而不是堆中的数据,也就是连个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容

var person1 =person

person1.name='王小星'

preson1.hobby[0] ='玩耍'



console.log(preson)   

console.log(person1) =====>结果相同

浅拷贝:
重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响

function shallowCopy(obj){
    var target={}
    for (var i in obj){
        if(obj.hasOwnProperty(i)){
            target[i]=obj[i]
        }
    }
    return target
}

var person1=shallowCopy(person)
person1.name="王小星"    //基本数据类型,基本数据类型互不影响

person1.hobby[0]= '玩耍'  //这里是引用数据类型 数组 所以拷贝前后对象会相互影响
console.log(person)
console.log(person1)

深拷贝
从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象
互不影响

function deepClone(obj){
    var cloneObj={}
    if(obj === null) return obj //当 typeOf去console.log null时,出现的也是obj对象
    if(obj instanceof Date) return new Date(obj) //instanceof 用来判断左边的是否为右边的类的实例(就是说Date的propertype是否在obj的原型链上)
    if(obj instanceof RegExp) return new RegExp(obj)
    if(typeOf obj !=='object') return obj
     for (var i in obj){
        if(obj.hasOwnProperty(i)){
            cloneObj[i]=deepClone(obj[i])
        }
    }
    return cloneObj
}

var person1=deepClone(person)

var person1=JSON.parse(JSON.stringify(person))
//json.parse的正则RegExp和function与深拷贝的不同

person1.name="王小星"    

person1.hobby[0]= '玩耍' 
console.log(person)
console.log(person1)

FCA1978
14 声望0 粉丝

拒绝做讨好性人格