JS 里三种途径比较深拷贝

三葉Leaves Author

什么是深拷贝

对比下面这几种:

直接赋值

对于一个对象来说,使用直接赋值的方式把一个对象赋值给另一个对象,之后对两个对象进行操作,两者会相互影响。

浅拷贝

使用 Object.assign(新对象,旧对象) 方法或者展开运算符,可以对对象进行浅拷贝。
对于对象里的第一层元素,确实是拷贝出了新的东西。
然而如果该对象里嵌套了数组或者对象,那对于子数组或者对象来说,仍然只是拷贝了地址过去。之后对子数组或者对象进行的操作,仍然会在新旧对象之间相互影响。

深拷贝

深拷贝能解决上面的这些问题。本文下面给出的代码,通过了三种方式:

  1. 自己写的递归函数
  2. 使用 JSON 字符串
  3. 使用 lodash 库函数
    实现了对象的深拷贝。
    值得注意的是,前两者并不能处理对象里的函数,而 lodash 库给出的 _.cloneDeep(objects) 方法确实可以。
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
const obj = {
name: "Leaves",
age: 18,
hobby: ["瓦罗兰特", (KUN = { first: "鸡", second: "篮球" }), 520],
phone: {
model: "iPhone13",
price: 6000,
},
hi: function sayHi() {
console.log("HELLO");
},
};
let o = {};
// ================ 自己写递归函数,但无法拷贝函数
/* function deepCopy(newObj, oldObj) {
for (const key in oldObj) {
if (oldObj[key] instanceof Array) {
newObj[key] = [];
deepCopy(newObj[key], oldObj[key]);
} else if (oldObj[key] instanceof Object) {
newObj[key] = {};
deepCopy(newObj[key], oldObj[key]);
} else {
newObj[key] = oldObj[key];
console.log("test");
}
}
}
deepCopy(o, obj); */
// ================ 使用JSON字符串,函数直接没出现
/* const str = JSON.stringify(obj);
console.log(str);

o = JSON.parse(str); */

// ================ 使用 lodash,唯一真神
o = _.cloneDeep(obj)

o.name = "stone";
o.hobby[1] = 999;
o.phone.model = "HUAWEI";
console.log(o);
console.log(obj);
</script>
  • 标题: JS 里三种途径比较深拷贝
  • 作者: 三葉Leaves
  • 创建于 : 2025-06-07 00:00:00
  • 更新于 : 2025-06-07 19:46:13
  • 链接: https://blog.oksanye.com/fc19b561f44b/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
JS 里三种途径比较深拷贝