什么是浅拷贝,深拷贝
- 浅拷贝拷贝的是地址,修改拷贝后的数据
对原数据有影响 - 深拷贝拷贝的是数据,修改拷贝后的数据
对原数据没有影响
let obj = {
name: '张三',
aeg: '18',
hobby: ['唱', '跳', 'rap', '篮球'],
}
// 浅拷贝拷贝的是地址
let obj1 = obj
obj1.hobby[0] = '吃饭'
// 请问只有obj1变还是obj也变
console.log(obj, obj1);
// 结果:震撼我妈。两个都变
注意:值类型和引用类型的区别。
如何实现深拷贝
-
json方式(推荐)
- 先把对象转json格式
JSON.stringify(js对象) - 再把json字符串转成js对象
JSON.parse(json字符串)
let obj = { name: '张三', aeg: '18', hobby: ['唱', '跳', 'rap', '篮球'], } let jsonStr = JSON.stringify(obj) let obj1 = JSON.parse(jsonStr) obj1.hobby[0] = '干饭' console.log(obj1, obj); - 先把对象转json格式
-
递归
forin遍历
let obj = { name: '张三', aeg: '18', hobby: ['唱', '跳', 'rap', '篮球'], } // newObj:拷贝后的新对象 obj:要拷贝的对象 function copy(newObj, obj) { // 遍历obj对象的所有属性,赋值给newObj for (let key in obj) { // 如果是值类型,则直接拷贝数据.如果是引用类型,继续遍历 if (obj[key] instanceof Array) { // 数组类型 newObj[key] = [] copy(newObj[key], obj[key]) } else if (obj[key] instanceof Object) { // 对象类型 newObj[key] = {} copy(newObj[key], obj[key]) } else { // 值类型 newObj[key] = obj[key] } }; } let obj1 = {} copy(obj1, obj) obj1.hobby[0] = '干饭' console.log(obj1, obj);