目录
在技术面试中,深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是考察JavaScript基础与理解对象复制机制的常见话题。掌握这两者不仅有助于解决实际开发中的数据隔离问题,还能在面试中展示你对JavaScript核心概念的深入理解。
浅拷贝创建一个新对象,其属性值是对原对象属性值的直接引用(对于非原始类型的属性)。这意味着如果原对象的属性是引用类型(如数组、对象),修改这些引用类型的数据会影响到拷贝对象。
Object.assign()
、展开运算符 ...
、以及直接赋值(对于数组或对象的第一层)。Object.assign()
- let original = { a: 1, b: { c: 2 } };
- let shallowCopy = Object.assign({}, original);
-
- // 修改原对象中的嵌套对象
- original.b.c = 3;
-
- console.log(original); // { a: 1, b: { c: 3 } }
- console.log(shallowCopy); // { a: 1, b: { c: 3 } } 注意b.c也被修改了
'运行
...
- let originalArray = [1, { a: 2 }];
- let shallowCopiedArray = [...originalArray];
-
- // 修改原数组中的对象
- originalArray[1].a = 3;
-
- console.log(originalArray); // [1, { a: 3 }]
- console.log(shallowCopiedArray); // [1, { a: 3 }] 数组中的对象被修改了
'运行
深拷贝创建一个新对象,并递归地复制原对象的所有属性,直至最底层的基本数据类型,确保原对象与拷贝对象在内存中完全独立。
parse
和 stringify
方法进行简单深拷贝(但注意这种方法的局限性,如无法处理函数和循环引用),或手写递归函数实现更全面的解决方案。- function deepCopy(obj) {
- if (obj === null || typeof obj !== 'object') return obj;
- let copy = Array.isArray(obj) ? [] : {};
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- copy[key] = deepCopy(obj[key]);
- }
- }
- return copy;
- }
-
- let original = { a: 1, b: { c: 2 } };
- let deepCopied = deepCopy(original);
-
- original.b.c = 3;
-
- console.log(original); // { a: 1, b: { c: 3 } }
- console.log(deepCopied); // { a: 1, b: { c: 2 } } 深拷贝后的对象不受影响
'运行
- let originalSimple = { a: 1, b: 2 };
- let deepCopiedSimple = JSON.parse(JSON.stringify(originalSimple));
-
- // 假设我们尝试修改原对象
- originalSimple.a = 3;
-
- console.log(originalSimple); // { a: 3, b: 2 }
- console.log(deepCopiedSimple); // { a: 1, b: 2 } 深拷贝对象不受影响
-
- // 注意:此方法不适用于含有函数、RegExp、Date等特殊类型或循环引用的对象
'运行
- // 首先确保已经安装并导入了lodash
- import _ from 'lodash';
-
- let originalLodash = { a: 1, b: { c: 2 } };
- let deepCopiedLodash = _.cloneDeep(originalLodash);
-
- originalLodash.b.c = 3;
-
- console.log(originalLodash); // { a: 1, b: { c: 3 } }
- console.log(deepCopiedLodash); // { a: 1, b: { c: 2 } } 完全独立
掌握深拷贝与浅拷贝不仅是面试成功的关键,更是JavaScript高级开发不可或缺的知识点。通过深入理解其原理、实践操作及潜在问题,你将能在面试中脱颖而出,同时在日常开发中避免数据处理的常见bug。