对深浅拷贝的理解以及实现方式


堆和栈内存的介绍

说到深拷贝和浅拷贝,就得说到堆和栈,在js中有基础数据类型和引用数据类型,基础数据类型包括:Number、String、Boolean、Null、 Undefined、Symbol(ES6),其他都属于Object,例如function,object,Array,Class等

基础数据类型就存储在栈中,访问变量能直接访问到变量到值,栈内存是自由分配的,并且使用完毕系统会自动释放
引用数据类型对象实际存储在堆中,变量其实是保存在栈中的一个指针,指向堆中的对象,堆则是动态分配的内存

赋值、浅拷贝和深拷贝

因为引用类型变量存储的是一个指针,所以就导致了以下问题

赋值
	let obj = {a:'a',b:'b',};
	let obj1 = obj;
	obj1.a = 'c';
	console.log('obj',obj);//{a:'c',b:'b',}
	console.log('obj1',obj1);//{a:'c',b:'b',}
浅拷贝
// 浅拷贝
let obj1 = {
   name : '王二狗',
   age :  18,
   like : ['football',['book','writing'],['draw','photograph']],
};
let obj2 = copy(obj1);
obj2.name = "傻狗";
obj2.like[1] = ['football','brand'];
function copy(target:any) {
   var dst = {};
   for (var item in target) {
       dst[item] = target[item];
   }
   return dst;
}
console.log('obj1',obj1)
//obj1 
//{name: "王二狗"《《《《----没改变
//  age :  18,
// like : ['football','brand'], 《《《---改变了
//};
console.log('obj2',obj2)
//obj2
//{
//	name:"傻狗",
//	age:18,
//	like: ['football','brand']
}

浅拷贝是第一层拷贝内容,一层以上的属性就只能拷贝指针

深拷贝

完全实现所有属性的内容拷贝

浅拷贝实现方式

1. Object

1)Object.assign()

let obj = Object.assign({a:'a'},{b:'b'})

2)遍历赋值

function Copy(p){
   var c ={};
   for (let i in p){
      c[i]=p[i]
   }    
   return c;
}

3)展开运算符

let a = {a:'12212'}
let b = {...a}
2. Array

1)slice

let a = [1,2];
let b = a.slice();
b.push(3);

2)concat

let a = [1,2];
let b = a.concat();
b.push(3);

3)展开运算符

let a = [1,2];
let b =[...a];
b.push(3);

深拷贝实现方式

1. Object

1)递归

function copy(t){
   let r;
   for (let i in p){
    if(typeof t[i]==="object"){
      r[i]=(t[i].constructor ===Array)?[]:{}
      Copy(t[i],r[i]);
    }else{
       r[i]=t[i]
    }
   }    
   return c;
}

2)JSON.parse(JSON.stringify())

let a = {1, 3, {
   username: ' slm'
}};
let b = JSON.parse(JSON.stringify(a));
2.对象数组

1)map(只能拷贝第二层的内容)

let a = [{a:'a'},{b:'b'}];
let b = a.map(item=>({...item}));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值