深度克隆
克隆或者拷贝分为2种: 浅度克隆 、 深度克隆 。
- 浅度克隆 :基本类型为值传递,对象仍为引用传递。
- 深度克隆 :所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改。
实现深度克隆:
代码及注释:
// 参数deep: true 表示深度克隆 否则 浅克隆
Object.prototype.clone = function(deep){
// 获取到调用函数的对象
// this -> obj
// obj、array、function 基本数据类型
// 0 根据deep判断是否进行深克隆
// 1. 判断是否是数组
if(Array.isArray(this)){
// var arr = [];
// Array.prototype.slice(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();
}
// 2. 判断是否是对象
}else if(Object.prototype.toString.call(this) === '[object Object]'){
// 2.1 创建新对象 将克隆的对象进行遍历赋值
var obj = {};
for(var i in this){
// 判断obj中的属性是不是自身的
if(this.hasOwnProperty(i)){
if(deep){
// 深克隆 ?? this[i] 再一次数据类型判断 数组 对象
// this[i] -> z:[true,'1',10]
// 用当前需要克隆的数据 调用clone 判断当前数据的类型
obj[i] = this[i].clone(true);
}else{
// 浅克隆
obj[i] = this[i];
}
}
}
return obj;
}else {
// 基本数据类型 、函数
return this;
}
}