一、概念
首先,深拷贝和浅拷贝的概念只适用于对象或者数组这种复杂数据类型(引用数据类型)。
浅拷贝:只是拷贝数据的内存地址,改变其一
深拷贝:在内存中开辟一个新的存储空间,完完全全的拷贝一整个一模一样的对象(数组)
二、例子
浅拷贝:
//浅拷贝
let obj = { a: 1, b: 2 };
let newObj = obj;
newObj.a = 10;
console.log(obj); //{a:10,b:2}
console.log(newObj); //{a:10,b:2}
深拷贝:
//深拷贝
let deep = { a: 1, b: 2 };
let newDeep = JSON.parse(JSON.stringify(deep));
newDeep.a = 10;
console.log(deep); //{a:1,b:2}
console.log(newDeep); //{a:10,b:2}
// 注释: JSON.parse(JSON.stringify(deep))只是深拷贝的一种方式
三、方法
1、 JSON.parse(JSON.stringify())
let deep = { a: 1, b: 2 };
let newDeep = JSON.parse(JSON.stringify(deep));
newDeep.a = 10;
console.log(deep); //{a:1,b:2}
console.log(newDeep); //{a:10,b:2}
2、jQuery的extend方法实现深拷贝
let array = [1,2,3,4];
let newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝
3、Object.assign(obj1, obj2)
let deep = { a: 1, b: 2 };
let newDeep = Object.assign({}, deep);
newDeep.a = 10;
console.log(deep); //{a:1,b:2}
console.log(newDeep); //{a:10,b:2}
4、concat
concat ()方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
5、扩展运算符 ... ,slice
6、函数库lodash的_.cloneDeep方法