浅拷贝(Shallow Copy): 浅拷贝只复制对象的第一层属性,如果对象的属性是引用类型(比如数组、对象),则只会复制引用而不是实际的值。常见的浅拷贝方法包括Object.assign()和展开运算符...。
Object.assign() :
1 2 const original = { a : 1 , b : { c : 2 } };const shallowCopy = Object .assign ({}, original);
展开运算符(…):
1 2 const original = { a : 1 , b : { c : 2 } };const shallowCopy = { ...original };
Array.slice() :
对于数组,使用slice()方法也可以实现浅拷贝。
1 2 const originalArray = [1 , 2 , 3 ];const shallowCopyArray = originalArray.slice ();
Array.concat() :
另一个数组的浅拷贝方法是使用concat()方法。
1 2 const originalArray = [1 , 2 , 3 ];const shallowCopyArray = originalArray.concat ();
深拷贝(Deep Copy): 深拷贝会递归地复制所有层级的对象属性,确保新对象的每个值都是原始对象值的副本,而不是对同一引用的引用。
JSON.parse() 和 JSON.stringify():
使用JSON.parse()和JSON.stringify()结合可以实现简单的深拷贝,但无法处理循环引用以及特殊对象。
1 2 const original = { a : 1 , b : { c : 2 } };const deepCopy = JSON .parse (JSON .stringify (original));
使用第三方库 :
第三方库如 Lodash 提供了更完善和高效的深拷贝方法。
1 2 3 const _ = require ("lodash" );const original = { a : 1 , b : { c : 2 } };const deepCopy = _.cloneDeep (original);
自定义递归函数 :
可以编写自定义递归函数来处理深拷贝,能够更灵活地控制拷贝过程。
1 2 3 4 5 6 7 8 9 10 function deepCopy (obj ) { if (typeof obj !== "object" || obj === null ) { return obj; } const newObj = Array .isArray (obj) ? [] : {}; for (let key in obj) { newObj[key] = deepCopy (obj[key]); } return newObj; }
选择深拷贝还是浅拷贝取决于具体的需求。在处理简单的数据结构时,浅拷贝通常足够;但在需要完全独立的副本、或者处理复杂嵌套对象时,则需要深拷贝。不同的场景可能需要使用不同的拷贝方式。