浅拷贝只是复制了内存指引,深拷贝递归复制原对象所有嵌套对象及其属性。
对于基础数据类型,深浅拷贝没有区别;但是对于引用数据或者嵌套更深的对象,浅拷贝的对象与原对象指向的内存地址还是同一个,当对象改变时,原对象数据也跟着变化;而深拷贝的对象由于与原对象指向的内存地址已经不同,数据改变时不会影响原对象。
了解上述后,相信看下面的内容会感觉很清晰。
数据类型存储
前面已经提到,基本数据类型存储在栈内存中,引用数据保存在堆内存中,引用数据类型的变量指向堆内存中实际对象,存在栈中。
存在浅拷贝的方法
-
Object.assign()
// 原始对象 let originalObj = { name: 'John', age: 30, hobbies: ['reading', 'swimming'] }; // 浅拷贝 let shallowCopy = Object.assign({}, originalObj); shallowCopy.hobbies.push('running'); console.log(originalObj.hobbies); // 输出: ["reading", "swimming", "running"]
-
Array.prototype.slice()
let originalArray = [{name: 'John'}, {name: 'Alice'}, {name: 'Bob'}]; // 使用 slice(0, 1) 进行浅拷贝 let newArray = originalArray.slice(0, 1); // 修