js 深拷贝和浅拷贝面试题
时间: 2024-08-29 08:03:35 浏览: 89
JavaScript中的深拷贝和浅拷贝是关于数据复制的概念,用于处理复杂的数据结构,如对象、数组等。主要有以下几个点:
1. **浅拷贝**(Shallow Copy):创建新对象,仅复制原对象的第一层引用。这意味着如果原对象内部有嵌套的对象或数组,新的对象只会包含指向它们的引用,而不是完整的副本。对于简单类型(数字、字符串),浅拷贝实际就是深拷贝。例如,`var copy = [obj]` 就是浅拷贝。
2. **深拷贝**(Deep Copy):创建全新的对象,并对所有嵌套的对象和数组都做深度复制。这会使得新复制的对象与原始对象完全独立,修改其中一个不会影响另一个。在JavaScript中,对于复杂结构,可以借助第三方库如lodash的`_.cloneDeep()`或递归实现深拷贝。
**面试题示例**:
- 需求场景:解释何时应该选择浅拷贝,何时选择深拷贝?
- 测试案例:给出一个例子说明浅拷贝和深拷贝的区别。
相关问题
简短的叙述js深拷贝和浅拷贝面试题
### 深拷贝与浅拷贝简介
**浅拷贝 (Shallow Copy)** 和 **深拷贝 (Deep Copy)** 是 JavaScript 中处理复杂数据结构(如对象和数组)时常见的两个概念。
#### 浅拷贝
浅拷贝是指创建一个新的对象或数组,并将原始对象的第一层属性复制到新对象中。如果这些属性是基本类型(例如数字、字符串),它们会被直接复制;但如果这些属性本身也是引用类型(例如嵌套的对象或数组),则只会复制其引用地址,而不是实际的数据内容。因此,在对深层嵌套的对象进行修改时,原对象也会受到影响。
常见实现方式包括:
- 使用 `Object.assign()` 方法。
- 利用展开运算符 (`...`) 进行赋值操作。
示例代码:
```javascript
const obj1 = { a: 1, b: { c: 2 } };
const shallowCopyObj = Object.assign({}, obj1);
shallowCopyObj.b.c = 3;
console.log(obj1); // 输出: { a: 1, b: { c: 3 } }
```
从上面的例子可以看出,当我们改变`shallowCopyObj`中的b的c属性时,原本obj1里的相应部分也发生了变化。
#### 深拷贝
而深拷贝则是指完全独立地复制整个对象及其所有层级下的每一个元素。无论是简单类型的值还是复合类型的引用,都会被完整地克隆出来,形成新的内存空间存储副本。这意味着对新对象的操作不会影响原有的源对象。
常用的方法有:
- JSON.parse(JSON.stringify())
- 第三方库如 lodash 的 cloneDeep 函数
注意点:JSON 序列化/反序列化的方案无法处理函数以及循环引用等问题;
lodash 提供了一个更全面可靠的解决方案。
例子展示如何做深度复制并保持原有对象不变:
```javascript
const deepCloneWithLodash = _.cloneDeep({a : 1 ,b:{c:[1,{d:'test'}]}});
// 修改克隆后的对象内部的内容不影响原来的对象
deepCloneWithLodash.b.c[1].d='changed';
originalObject={a : 1 ,b:{c:[1,{d:'test'}]}};
console.log(deepCloneWithLodash=== originalObject)// false 表明他们不是同一个引用
console.log(originalObject)//{a : 1,b:{c:[1,{d:'test'}]}}
console.log(deepCloneWithLodash)//{a : 1,b:{c:[1,{d:'changed'}]}}
```
---
总结来说,选择哪种策略取决于具体的场景需求——如果你只需要第一级的数据共享,则可以选择效率更高的浅拷贝;而对于需要彻底隔离的情况,则应考虑使用深拷贝技术。不过需要注意的是,对于某些特殊情况(比如包含函数或者存在循环依赖的情况下),传统的做法可能会出现问题,此时可以借助外部工具辅助完成任务。
js深拷贝和浅拷贝面试
深拷贝和浅拷贝是JavaScript中常见的面试题。浅拷贝是指直接复制变量的引用,而深拷贝是创建一个完全独立的对象副本。在浅拷贝中,两个变量引用同一个内存地址,因此修改一个变量会影响到另一个变量。例如,当使用浅拷贝将一个对象赋值给另一个变量时,修改其中一个对象的属性会影响到另一个对象。
浅拷贝通常可以解决大部分问题,但是当遇到嵌套对象的情况时,浅拷贝无法解决。例如,当使用浅拷贝将一个对象赋值给另一个变量时,如果对象中包含另一个对象,那么两个对象将共享同一个内存地址。因此,修改嵌套对象的属性会同时影响到两个变量。
为了解决浅拷贝无法处理嵌套对象的问题,我们可以使用深拷贝。一种常用的深拷贝方法是使用JSON.stringify和JSON.parse。通过将对象转换为JSON字符串,然后再将JSON字符串转换回对象,可以创建一个完全独立的对象副本。这样,修改一个对象的属性不会影响到另一个对象。
总结来说,深拷贝和浅拷贝是两种不同的对象复制方式。浅拷贝只复制变量的引用,而深拷贝创建一个完全独立的对象副本。深拷贝通常用于解决嵌套对象共享引用的问题,可以使用JSON.stringify和JSON.parse方法实现深拷贝。
阅读全文
相关推荐
















