深拷贝的两种实现

深拷贝和浅拷贝

在JavaScript中,对于object等引用类型值,当从一个变量向另一个变量复制引用类型值时,这个值的副本其实是一个指针,两个变量指向同一个堆对象,改变其中一个变量,另一个也会受到影响。

很多情况下,我们都需要给变量赋值,但希望和原来变量不再共存一个地址。所以就要实现深拷贝。

深拷贝的两种实现

1
2
3
4
5
6
7
8
9
10
var obj1={
name: 'yoowin',
hobby: {
nbateam: 'lakers',
singer: {
man: 'zhangxueyou',
woman: 'fanweiqi'
}
}
}
  • 第一种深拷贝(通过递归实现深拷贝)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function deepCopy(obj){
var newObj={};
if(obj.hasOwnProperty){
for(var key in obj){
if (typeof obj[key] === 'number' || typeof obj[key] === 'string' || typeof obj[key] === undefined || typeof obj[key] === null || typeof obj[key] === 'boolean') {
newObj[key] = obj[key];
}else{
newObj=deepCopy(obj[key]);
}
}
}
return newObj;
}
var obj2=deepCopy(obj1);
console.log(obj2)
  • 第二种深拷贝(利用JSON对象中的parse和stringify)
1
2
3
4
5
6
function deepCopy(obj){
var newObj=JSON.parse( JSON.stringify(obj) )
return newObj;
}
var obj2=deepCopy(obj1);
console.log(obj2)
0%