一、浅拷贝
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型, 拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。浅拷贝的主要作用就是只拷贝原对象的值,而不拷贝其地址,这样才能保证两个对象独立,但是如果原对象属性中有引用类型的值,则只能拷贝其地址,因为浅拷贝只能拷贝一层。
基本数据类型:
var a = 8;
var b = a;
var a = 17
console.log(a, b);//17,8
引用数据类型:
var obj1 = {
name: 'liuxiaofeng',
age: 23
}
var obj2 = obj1
obj2.name = 'jiaxin'
console.log(obj1, obj2);
打印结果:
这里可以看到浅拷贝没有拷贝引用类型的值,只是拷贝了其地址,相当于两个对象指向一个地址。
1.对象实现浅拷贝的方法,Object.assign(a,b),意思就是b把浅拷贝给a.
var obj1 = {
name: 'liuxiaofeng',
age: 23
}
var obj2 = {}
Object.assign(obj2, obj1)
obj2.name = 'jiaxin'
obj1.age = 24
console.log(obj1, obj2);
打印结果:
2.数组浅拷贝
(1)concat()
var arr2 = arr1.concat();
arr1.push(4)
console.log(arr1, arr2);
打印结果: 此时的arr2跟原来的arr1是一模一样的,改变了arr1后,arr2也是没有发生改变的,因为arr2的数据空间是一个新的地址。
(2) slice()
var arr1 = [7, 8, 9];
var arr2 = arr1.slice();
arr1.push(4)
console.log(arr1, arr2);
打印结果: 与concat()一样
数组中还有引用类型的情况
var arr1 = [7, 8, 9, [4, 5, 6]];
var arr2 = arr1.slice();
arr1[3].push('yinyong')
console.log(arr1, arr2);
打印结果:
concat也是一样的
这就是浅拷贝,如果数据中都是基本类型数据,就是完全没有联系的两个数据,但是如果数据中引用类型数据,那两个变量还是有一定的联系。 所谓浅拷贝,也就是说,数组或对象中的值如果是基本类型数据,那拷贝后的数据和原数据是完全没有关联,且互不影响的两个数据,如果数组或对象的值是引用类型数据的话,拷贝后的数组或对象中的引用类型的值跟原数据中的引用类型的值,还是存在共享同一地址的现象。
二、深拷贝
深拷贝可以不管数据中的值是什么类型的数据,拷贝后的新数据跟原数据没有关系。
1.利用JSON数据和JSON字符串之间进行转换
(1)对象深拷贝
var obj = {
name: "liuxiaofeng",
height: 180,
wife: {
name: "jiaxin",
age: 23
}
}
var str = JSON.stringify(obj);
var pbj = JSON.parse(str);
obj.wife.age = 18;
console.log(obj.wife);
console.log(pbj.wife);
打印结果:
(2)数组深拷贝
var arr1 = [7, 8, 9, [2, 3, 4]];
var str = JSON.stringify(arr1);
var arr2 = JSON.parse(str);
arr1[3].push('feng');
console.log(arr1[3], arr2[3]);
打印结果: