1.基本概念
-
(1)深拷贝和浅拷贝针对的是引用类型。基本类型的名值存储在栈中,当复制时,栈内存会开辟一个栈内存。所以二者修改时,彼此不会影响。
-
(2)浅拷贝复制的是指向对象的指针,并没有开辟新的栈内存,原对象和新对象还是共享同一块内存,修改新对象自然会影响原对象。
深拷贝会开辟新的栈内存,原对象和新对象不共享同一块内存,修改新对象不会影响到原对象。
2.实现方式
2.1深拷贝的实现方式
- 2.1.1 JSON.parse(JSON.stringify())
说明:
1.用JSON.stringify将对象转成JSON字符串,再用**JSON.parse()**把字符串解析成对象。一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
2.这种方法虽然可以实现数组或对象的深拷贝,但不能处理函数。因为JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,不能接受函数
示例:
var iniArr = [1,2,{
name:"peter"},function(){
}];
var newArr = JSON.parse(JSON.stringify(iniArr));
newArr[1] = 8;
newArr[2].name = "lily";
console.log('JSON.parse(Json.stringfiy()):iniArr,newArr',iniArr,newArr
打印结果:
- 2.1.2递归方法
原理:
遍历对象、数组,直到里边都是基本数据类型,然后再去复制,即可实现深度拷贝。
示例:
var iniObj = {
a: 1,
b: [1, 2, 3],
c: {
d: {
e: 4
}
},
fun: function(){
return 999;
}
};
function deepClone(x) {
if (x.constructor === Object) {
var obj = {
}
for (var k in x) {
obj[k] = deepClone(x[k])