浅拷贝与深拷贝的区别:
浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象
深拷贝改变新对象不会影响原对象,他们之前互不影响。
一.浅拷贝
浅拷贝只拷贝一层,更深层次对象级别只拷贝地址
当我们把 obj对象里面的内容拷贝给了 o之后,修改o 里面的值,obj 也会相应的改变
对对象进行浅拷贝的方法有两种
一是利用 for in 循环,把原有 obj 对象里面的每一项都拷贝一个空对象 o
二是利用es6新增的语法 Object.assign(o,obj)
<script type="text/javascript">
var obj = {
name:'张三',
age:21,
fn:{
sex:'女'
}
}
var o = {}
/* 遍历对象,把 obj 的值,给 o */
for(var k in obj){
o[k] = obj[k]
}
/* // es6 新增方法实现浅拷贝
Object.assign(o,obj)
console.log(o); */
console.log(o);
// 改变 o 的值,obj 的纸也随之改变
o.fn.sex = '男';
console.log(obj);
</script>
二.深拷贝
深拷贝拷贝多层,每一级别的数据都会拷贝
obj对象会开辟一个新的空间,深拷贝就是 obj对象 在新的空间里面又重新复制了一个空间,然后把拷贝过的空间给 o对象。相当于A有一份文档,B想拿过来改一下,但是会影响A里面的内容,于是A就先自己复制了一份,把新复制的给了B
实现深拷贝(递归的的方法)
注意:判断item的数据类型时,Array 要写在 Object 的前面,因为 数组是特殊的对象
<script type="text/javascript">
var obj = {
name:'张三',
age:21,
fn:{sex:'女'},
color:['red','yellow','blue'],
}
var o = {}
// 封装函数
function deepCopy(newobj,oldobj){
for(var k in oldobj){
// 判断属性值属于那种类型,获得属性值 obj[k]
var item = oldobj[k]
// 判断属性值是不是复杂类型、
// 判断是否为数组
if(item instanceof Array){
newobj[k] = []
deepCopy(newobj[k],item)
// 判断是否为对象
} else if(item instanceof Object){
newobj[k] = {}
deepCopy(newobj[k],item)
}else{
// 这是简单数据
newobj[k] = item;
}
}
}
deepCopy(o,obj)
console.log(o)
o.age = 22;
o.name = '李四';
console.log(o);
console.log(obj);
</script>