浅克隆和深克隆都是对引用地址的克隆。
浅克隆
浅克隆就是当我把obj{}对象里面的所有属性拷贝到obj1{}中后,然后我分别改变对象里面的变量,原始值互不影响,引用值一个改变,另一个跟着变。
代码如下:
function clone(origin, target) {
var target = target || {}
for (var item in origin) {
target[item] = origin[item]
}
return target
}
var obj = {
name: '小哥',
age: 102,
sex: 'male'
}
var obj2 = {}
clone(obj, obj2)
obj.name = '李四'
console.log(obj, obj2)
改变其中一个值,另一个值不会改变
深克隆
所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改
var obj = {
name: '小哥',
age: 120,
sex: 'male',
hobby: ['冒险', '耍帅', '练武'],
boyfriend: {
name: '小三爷',
age: 28
}
}
var obj2 = {}
deepClone(origin ,target) {
var target = target || {}, //容错处理,防止用户不传target值
toStr = Object.prototype.toString,
arrAtr = "[object Array]"
for(var item in origin) { //遍历对象
if (origin.hasOwnProperty(item)) { //防止拿到原型链属性
if (origin[item] !== null && typeof (origin[item]) === 'object') { //判断是不是原始值
target[item] = (toStr.call(origin[item]) === arrAtr) ? [] : {} //建立相对应的数组或对象
deepClone(origin[item], target[item]) //递归,为了拿到引用值里面还有引用值
} else {
taget[item] = origin[item] //是原始值,直接拷贝
}
}
}
}