堆和栈内存的介绍
说到深拷贝和浅拷贝,就得说到堆和栈,在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}));