js实现深浅克隆
浅克隆:基本数据类型,则直接赋值,引用类型,则赋值的是地址。引用类型引用的是同一块地址,所以其中一方改变时,另一方也会改变
深克隆:基本数据类型,则直接赋值,引用类型创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。
实现:定义函数将其挂载到Object的原型上,传入标记判断深浅克隆,然后判断判断其类型标记是否深克隆,基本类型直接返回,引用类型遍历每一项的值递归调用自己。
代码如下
Object.prototype.clone = function (deep) {
// 判断是否是数组
if (Array.isArray(this)) {
// 是否深度克隆
if (deep) {
// 深克隆
// 创建一个新数组
var arr = [];
for (var i = 0; i < this.length; i++) {
arr.push(this[i].clone(true))
}
return arr;
} else {
// 浅克隆
return this.slice();
}
}
//判断是否是对象
else if (Object.prototype.toString.call(this) === '[object Object]') {
// 创建一个新对象
var obj = {};
for (var i in this) {
// 判断是否是自身的属性
if (this.hasOwnProperty(i)) {
// 是否深度克隆
if (deep) {
// 深克隆
// this[i]取出,是个基本类型
obj[i]=this[i].clone(true);
} else {
// 浅克隆 直接传入地址
obj[i]=this[i]
}
}
}
return obj;
}
// 其他类型
else {
// 直接返回
return this.valueOf()
}
}