导航菜单
首页 >  » 正文

深拷贝和浅拷贝面试题到底有什么区别?

深拷贝和浅拷贝面试题到底有什么区别?

深拷贝和浅拷贝是面试中常被问及的知识点。那么这两种拷贝方式到底有什么区别呢?

首先说结论:深拷贝和浅拷贝的主要区别在于,当存在多层嵌套的对象时,浅拷贝只会复制最外层的对象,深拷贝则会将所有相关的对象进行递归复制。

深拷贝和浅拷贝的定义

浅拷贝是指将一个已创建对象的地址赋值给一个新的变量,这个新变量指向原有对象。因此,当新变量的值发生改变时,原有对象的值也会发生改变。这里的拷贝只是对对象中的元素进行值的复制。在 JavaScript 中可以使用 Object.assign() 或者扩展运算符(...) 实现浅拷贝。

深拷贝是指将一个已创建对象完整地复制一份,并将其中的所有关联对象也复制一份,因此在任何一份对象发生改变时,都不会影响到另一份对象。在 JavaScript 中可以使用 JSON.parse(JSON.stringify()) 或者递归方法实现深拷贝。

深拷贝和浅拷贝的区别

浅拷贝只是复制一个对象的引用,新增的对象改变时也会影响原对象,原因是新对象并没有真正的脱离原对象,还处于原对象的引用下。

深拷贝则不同,从根本上解决了这个问题,每一层的对象都会重新创建,完全独立于原对象。

深拷贝和浅拷贝的应用场景

浅拷贝适用于某些简单类型的变量,比如字符串、数字、布尔值和 null/undefined 等。因为这些类型的变量很小,复制它们会比重新创建它们所花费的时间更少。此外,如果复制后的变量不会改变,那么浅拷贝也是可行的。

深拷贝适用于包含嵌套对象的变量,比如对象和数组。因为这些对象非常大且包含了大量的数据和嵌套关系,重新创建它们会更快。此外,如果克隆后的变量会被改变,深拷贝也是必须的。

浅拷贝和深拷贝在 JavaScript 中的应用

在 JavaScript 中,常用的浅拷贝方式有 Object.assign() 和扩展运算符(...)。下面的例子演示了这两个的用法:

```javascript let obj1 = { a: 1, b: { c: 2 } }; let obj2 = Object.assign({}, obj1); let obj3 = { ...obj1 }; obj2.b.c = 3; console.log(obj1.b); // { c: 3 } console.log(obj2.b); // { c: 3 } console.log(obj3.b); // { c: 2 } ```

可以看到,使用 Object.assign() 和扩展运算符(...) 所创建的对象都是浅拷贝。因此,当修改了 obj2.b.c 的值时,obj1.b 和 obj2.b 都会改变,而 obj3.b 的值不会发生修改。

在 JavaScript 中,常用的深拷贝方法有 JSON.parse(JSON.stringify()) 和递归函数。下面的例子演示了这两种方法的用法:

```javascript let obj1 = { a: 1, b: { c: 2 } }; let obj2 = JSON.parse(JSON.stringify(obj1)); obj2.b.c = 3; console.log(obj1.b); // { c: 2 } console.log(obj2.b); // { c: 3 } ```

由于 JSON.stringify() 方法会将对象序列化为 JSON 字符串,再使用 JSON.parse() 方法将其还原成对象,这个过程中实现了深拷贝。因此,当修改了 obj2.b.c 的值时,obj1.b 不会发生修改。

递归函数可以遍历对象中的所有层级,对每一层级都进行深度拷贝。下面的例子演示了递归函数的用法:

```javascript function deepClone(obj) { if (typeof obj === "object"

相关推荐: