JavaScript数据结构-深拷贝和浅拷贝

浅拷贝
  • 浅拷贝只拷贝一层(简单数据类型的),更深层次对象级别的只拷贝引用
var obj = {
    
    
    id:1,
    name: 'andy',
    msg:{
    
    
        age:18,
    },
    color:['pink','red'],
};
var o = {
    
    };

//两种浅拷贝方式
//1.通过循环遍历
for(var k in obj){
    
    
	//k是属性名  obj[k]属性值
	o[k] = obj[k];
}
//2.通过assign()进行拷贝,有两个参数,第一个是要拷贝给他东西的对象,第二个是拷贝的对象
Object.assign(o,obj);

console.log(o);		//o会获得跟obj一样的值
//但是改变o.msg.age后,obj的age也会被改变
o.msg.age = 20;
console.log(obj);
深拷贝
  • 深拷贝拷贝多层,每一级别的数据都会拷贝
var obj = {
    
    
    id:1,
    name: 'andy',
    msg:{
    
    
        age:18,
    },
    color:['pink','red'],
};
var o = {
    
    };
//封装函数
function deepCopy(newobj,oldobj){
    
    
    for(var k in oldobj){
    
       //var k in oldobj表示遍历oldobj里的每一个对象k
        //判断属性值属于那种数据类型
        //1.获取属性值  olgobj[k]
        var item = oldobj[k];
        //2.判断这个值是否是数组
        if(item instanceof Array){
    
    
            newobj[k] = [];             //如果是数组的话就设置newobj[k]为一个空数组
            deepCopy(newobj[k],item);   //在通过递归,把item里的值赋给这个空数组
        }else if(item instanceof Object){
    
    
            //3.判断这个值是否是对象
            newobj[k] = {
    
    };             
            deepCopy(newobj[k],item);
        }else{
    
    
            //4.属于简单数据类型
            newobj[k] = item;
        }
    }
}

deepCopy(o,obj);
console.log(o);
console.log(obj);
o.msg.age = 20;

猜你喜欢

转载自blog.csdn.net/weixin_45663697/article/details/110453175
今日推荐