JavaScript浅度和深度复制的实现方法
# 1、js对象和数组的浅度拷贝
对象的 object.assign()
,数组的 Array.prototype.slice()
和 Array.prototype.concat()
,还有 ES6
的 [...]
(扩展运算符),都有类似的问题,它们都属于浅拷贝。可以这样理解:只拷贝第一层的原始类型值,和第一层的引用类型的地址。例如:
const obj = {a:1, b:2};
const obj2 = Object.assign({}, obj);
const arr1 = [1, 2];
const arr2 = arr1.slice(0);
const arr1 = [1, 2];
const arr2 = arr1.concat();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2、利用递归深拷贝
function deepClone(source) {
const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
for (let keys in source) {
// 遍历目标
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === "object") {
// 如果值是对象,就递归一下
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = ZFSN.deepClone(source[keys]);
} else {
// 如果不是,就直接赋值
targetObj[keys] = source[keys];
}
}
}
return targetObj;
}
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
# 3、利用JSON解决深拷贝
JOSN.parse()
方法将 JSON
字符串转化为对象,JSON.stringify()
方法将 JavaScript
字符串转化为对象。
const arr = [{key:'name',value:1}, 2];
const newArr = JSON.parse(JSON.stringify(arr));
1
2
2
注意
注意:JSON 内部用了递归的方式,数据一但过多,就会有递归爆栈的风险。
上次更新: 2024/01/30, 00:35:17
- 02
- Node与GLIBC_2.27不兼容解决方案08-19
- 03
- Git清空本地文件跟踪缓存08-13