1、浅层克隆
注意:这种浅层克隆只能正常修改原始值,修改引用值时会将原本的也修改。
// 克隆
var obj = {
name : '张三',
age : 12,
sex : 'male',
arr : [1,2,3,4]
}
var obj1 = {};
// 自己写一个浅层克隆
function clone(origin,target){
// 作一个兼容 如果有传target就用target,没有就自己定义个{}
var target = target || {};
for(var prop in origin){
target[prop] = origin[prop];
}
}
clone(obj,obj1);
// // 注意:
// //这种浅层克隆只能正常修改原始值,修改引用值时会将原本的也修改。
// obj1.name = '李四';//正常只有obj1修改,obj不变
// obj1.arr[4] = 5;//obj1 obj都会被修改
2、深层克隆
// 深层克隆
var obj = {
name : 'abc',
age : 12,
arr : [1,2,3,4,5],
json : {
a : 'a',
b : [4,5,6,7],
c : {
d : 'd',
e : 'e'
}
}
}
var obj1 = {};
// 思路:
// 用typeof来区分出引用值跟原始值
// 用Object.prototype.toString.call()来区分数组跟json
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrType = '[object Array]';
for(var prop in origin){
// 只想克隆对象自身的属性,不想要原型链上的属性。
// 用hasOwnProperty判断是否是自身的属性
if (origin.hasOwnProperty(prop)) {
// 要判断的是origin[prop]的值是否引用,不是键
// 所以要对origin[prop]类型做判断。而且排除null的类型。
if (origin[prop] !== 'null' && typeof origin[prop] == 'object') {
// 引用值的情况
if (toStr.call(origin[prop]) == arrType) {
// 是数组的情况
target[prop] = [];
}else{
// json
target[prop] = {};
}
// 由于数组也可用for in 直接用递归,再次拷贝引用值内的值
deepClone(origin[prop],target[prop]);
}else{
// 原始值的情况 直接拷贝赋值
target[prop] = origin[prop];
}
}
}
}
deepClone(obj,obj1)