浅拷贝
浅拷贝是创建一个新对象,这个新对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型(如字符串、数字、布尔值等),拷贝的就是基本类型的值本身;如果属性是引用类型(如对象、数组等),拷贝的是引用类型的引用地址,而不是引用类型本身。 Object.assign () 方法(适用于对象) let targetObj = {}; let sourceObj1 = { a: 1 }; let sourceObj2 = { b: 2 }; let sourceObj3 = { c: 3 }; Object.assign(targetObj, sourceObj1, sourceObj2, sourceObj3); console.log(targetObj); // { a: 1, b: 2, c: 3 } |
展开运算符(适用于对象和数组) |
深拷贝
深拷贝是创建一个新对象,并且递归地复制原始对象的所有属性,包括嵌套对象的属性。新对象与原始对象不共享任何引用,修改新对象不会影响原始对象。 |
JSON.parse (JSON.stringify ()) 方法(存在局限性): let originalObj = { name: 'John', age: 25, hobbies: ['reading', 'swimming'] }; let deepCopyObj = JSON.parse(JSON.stringify(originalObj)); |
递归复制方法(自定义函数) function deepCopy(obj) { if (typeof obj!== 'object' || obj === null) { return obj; } if (Array.isArray(obj)) { let arr = []; for (let i = 0; i < obj.length; i++) { arr[i] = deepCopy(obj[i]); } return arr; } let newObj = {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = deepCopy(obj[key]); } } return newObj; } let originalObj = { name: 'John', age: 25, hobbies: ['reading', 'swimming'] }; let deepCopyObj = deepCopy(originalObj); |
使用第三方库(如 Lodash 的 cloneDeep 方法) const _ = require('lodash'); let originalObj = { name: 'John', age: 25, hobbies: ['reading', 'swimming'] }; let deepCopyObj = _.cloneDeep(originalObj); |