浅拷贝只是拷贝的栈区的引用地址
{
let a = {key1:'小明'}
function Copy(p){
// 自定义一个空对象,用来存放遍历过程中拿到的内容
let c = {};
// 遍历
for(let i in p){
c[i] = p[i]
}
// 遍历结束后,把c里得到的内容进行返回输出
return c
}
// 给a对象添加属性key2,并赋值存储一个数组
a.key2 = ['小结','小兰']
let b = new Copy(a)
// 给对象b添加key3属性,并赋值存储一个字符串
b.key3 = '她俩不一样'
// 向b对象的key2中追加一个内容,放入数组中
b.key2.push('小平')
console.log(b); // { key1: '小明', key2: [ '小结', '小兰', '小平' ], key3: '她俩不一样' }
console.log(a); // { key1: '小明', key2: [ '小结', '小兰', '小平' ] }
console.log(a.key3); // undefined
}
上面这个例子,加一点个人的理解:
因为b对象往数组中push进一个内容,此时是加在’堆‘内容里面的,因为a和b的引用地址都没有变,所以在对象a和b内都加了进去
对象的浅拷贝:
{
let o1 = {id:1,name:'小民'}
let o2 = o1
o2.name = '小李'
o2.age = 19
console.log(o1.name); // 小李
console.log(o2.name);// 小李
console.log(o1,o2);//{ id: 1, name: '小李', age: 19 } { id: 1, name: '小李', age: 19 }
}
数组的浅拷贝:
{
let arr1 = [1,2,3,4,5]
let arr2 = arr1
arr1[0] = 5
console.log(arr1,arr2);
}