JavaScript-浅拷贝和深拷贝
# 浅拷贝
浅拷贝:对基本类型的值拷贝,以及对象类型的地址拷贝。
var a = 1;
var b = a;// 浅拷贝
b = 2 // 改变b的值,并不会影响到a,因为浅拷贝对基本类型而言就是值拷贝
console.log(a) //1
1
2
3
4
2
3
4
a还是1
对象也适用
var p1 = {
name:'jack'
}
var p2 = p1
p2.name = 'rose'
console.log(p1)// { name: 'rose' }
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 深拷贝
深拷贝:除了拷贝基本类型的值,还完全复刻了对象类型。
一个对象在内存中是固定存在的,我们如果要对其进行深拷贝,唯一的办法就是创建一个新的对象,里面的值完全复刻原来的对象。
var p1 = {
name:'jack'
}
var p2 = {
name:p1.name
}
p2.name = 'rose'
console.log(p1) // { name: 'jack' }
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
以上操作,我们对p2进行改造不会影响到p1,这就是深拷贝。
但用这种方法实现深拷贝是可以的,但熟悉太多的话,就会很繁琐。
# JSON进行转换
实际开发中,可能这种方式用的更多一些,比如把一些数据转成JSON存储在本地缓存,需要用到的时候,我们再反序列化。
var p1 = {
name:'jack',
age:12
}
var p2 = JSON.parse(JSON.stringify(p1))
p2.name = 'rose'
console.log(p1)//{ name: 'jack', age: 12 }
console.log(p2)//{ name: 'rose', age: 12 }
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 深拷贝递归
// deepCopy接收两个参数,dest目标对象,src源对象
function deepCopy(dest,src){
// 对目标对象进行判空,如果为空就赋值一个空对象,保证dest有值
var dest = dest || {}
// 遍历src所有属性
for(var key in src){
// 如果对象的属性又是对象,则递归处理
if(typeof src[key] === "object"){
// 判断src[key]是对象还是数组
dest[key] = (src[key].construtor === Array)?[]:{}
deepCopy(dest[key],src[key])
}else{
dest[key] = src[key]
}
}
return dest
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
测试:
var p1 = {
name: 'jack',
age: 12,
toy: {
name: 'car'
}
}
var p2 = deepCopy({}, p1)
// deepCopy接收两个参数,dest目标对象,src源对象
function deepCopy(dest, src) {
// 对目标对象进行判空,如果为空就赋值一个空对象,保证dest有值
var dest = dest || {}
// 遍历src所有属性
for (var key in src) {
// 如果对象的属性又是对象,则递归处理
if (typeof src[key] === "object") {
// 判断src[key]是对象还是数组
dest[key] = (src[key].construtor === Array) ? [] : {}
deepCopy(dest[key], src[key])
} else {
dest[key] = src[key]
}
}
return dest
}
p2.toy.name = 'plane'
console.log(p1)//{ name: 'jack', age: 12, toy: { name: 'car' } }
console.log(p2)//{ name: 'jack', age: 12, toy: { name: 'plane' } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
上次更新: 2024/08/14, 04:14:33