在了解浅拷贝和深拷贝之前,我们先了解一下javascript的变量的存储方式:栈(stack)和堆(heap)
- 栈:自动分配内存空间,系统自动释放,存放的是基本数据类型以及引用数据类型的引用(内存地址)
- 堆:动态的分配内存,大小不定,不会自动释放,存放的是引用类型的值。
浅拷贝
浅拷贝只是拷贝了指针,拷贝后两个指针指向同一块内存空间
//先声明一个对象
var obj={
name:'张三',
age:18,
say(){
console.log('姓名:'+name,'年龄:'+age);
}
}
var obj1=obj;
obj.name='李四';
console.log(obj);
结果:
深拷贝
两个对象没有关联
1.方法一:通过json的方法实现
缺点:只能拷贝属性,无法拷贝方法
var obj1=JSON.stringify(obj);
obj1=JSON.parse(obj1);
obj1.name='李四';
console.log('obj:',obj);
console.log('obj1',obj1);
结果:发现并没有拷贝方法
2.方法二:通过for-in遍历循环实现
var obj1={}; //声明一个空数组
for(var attr in obj){
obj1[attr]=obj[attr];
}
obj1.name='李四';
console.log('obj:',obj);
console.log('obj1',obj1);
结果:完美拷贝并生成了一个新对象
方法三 利用Object.assign()
var obj1={};
Object.assign(obj1,obj)
obj1.name='李四';
console.log('obj:',obj);
console.log('obj1',obj1);
结果:
方法四 利用 … 语法
var obj1={...obj};
obj1.name='李四';
console.log('obj:',obj);
console.log('obj1',obj1);
结果: