浅拷贝/深拷贝

1.浅拷贝

1.对于数组或者对象,直接用等于号赋值的话,就属于浅拷贝,不管基本类型引用类型都会受影响

let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2[0] = 0;
 
let obj1 = {name: 'Tom'};
let obj2 = obj1;
obj2.name = 'Jerry'
 
console.log(arr1, arr2, obj1, obj2);
//   [ 0, 2, 3 ] [ 0, 2, 3 ] { name: 'Jerry' } { name: 'Jerry' }

2 for循环和Object.assign()进行拷贝,外层深拷贝,内层浅拷贝

let arr1 = [1, 2, 3];
let obj1 = {name: 'Tom'};


let arr3 = [];
for (let i = 0;i < arr1.length; i++) {
	arr3[i] = arr1[i]
}
arr3[0] = 0;
 
let obj3 = {};
for (let k in obj1) {
	obj3[k] = obj1[k]
}
obj3.name = 'Lucy';
 
console.log(arr1, arr3, obj1, obj3);
//  [ 1, 2, 3 ] [ 0, 2, 3 ] { name: 'Tom' } { name: 'Lucy' }
let obj = {
    name : '天天开心',
    arr : [1,[2,3],4],
};
let obj1=Object.assign({}, obj);
obj1.name = "demo";
obj1.arr[1] = [5,6,7] ; 
// 这是个浅拷贝的方法,这里改变了对象的引用类型

console.log('obj',obj) 
// obj1 { name: '天天开心', arr: [ 1, [ 5, 6, 7 ], 4 ] }
console.log('obj1',obj1) 
// obj3 { name: 'demo', arr: [ 1, [ 5, 6, 7 ], 4 ] }

2. 深拷贝

从堆内存中开辟了一个新区域存放对象,堆对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响
实现方式:JSON.parse(JSON.stringify())//不能拷贝函数和正则

let arr = [1, 3, { username: ' kobe' }];
    let arr1=JSON.parse(JSON.stringify(arr))
    arr1[2].username = 'demo';
    arr1[0]=18,
    console.log(arr)//[1, 3, { username: ' kobe' }]
    console.log(arr1)//[18, 3, { username: ' demo' }]

发表评论 / Comment

用心评论~