JavaScript对象深度克隆的简单实现

众所周知,对象是一种引用类型
对象的地址指针存放于栈中,而对象实际的数据存放于堆中。
因此当我们简单地执行复制操作时,实际是把地址指针进行了复制操作,因此在对象的实际数据改变之后,新旧对象都会受到影响。
那么如何不受到影响呢?

此谓深度克隆
JS中的深度克隆,指的是原对象改变了,克隆出来的新对象也不会改变,原对象与新对象是完全独立的关系。
有深度克隆就是
浅度克隆
原始类型为值传递,对象类型仍为引用传递。

(1)原始类型包括:数值、字符串、布尔值、null、undefined
(2)对象类型包括:对象即是属性的集合,当然这里又两个特殊的对象----函数(js中的一等对象)、数组(键值的有序集合)。

原始类型复制:

//数值克隆的表现
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//字符串克隆的表现
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"

//布尔值克隆的表现
var x=true;
var y=x;
y=false;
console.log(x);// true
console.log(y);// false

原始类型即使我们采用普通的克隆方式仍能得到正确的结果,原因就是原始类型存储的是对象的实际数据。
对象类型:
函数式一等对象,当然也是对象类型,但是函数的克隆通过浅克隆即可实现

var m=function(){alert(1);};
var n=m;
n=function(){alert(2);};
 
console.log(m());//1
console.log(n());//2

深度简单实现:

function deepClone(obj){
var newObj =obj instanceof Array ? [] :{};
for(var item in obj){
var temple=typeof obj[item] =='object' ? deepClone (obj[item]):obj[item];
newObj[item] =temple;
}
return newObj;
}

判定要克隆的对象是不是引用类型,如果是引用类型,则继续迭代,如果该项是基本类型,则直接复制。

发布了158 篇原创文章 · 获赞 44 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43277404/article/details/103846758