克隆是一个递归的过程:大概分为以下几步:
- 遍历对象 for in 或者 for of
- 判断是否是这个对象的属性 hasOwnProperty( )
- 判断是否具这个属性值的类型是否是object typeof(value ) === 'object',是则直接放入要克隆到的对象中,否则再判断是数组还是object ,这里是用的是Object的toString() 这个方法不同的类型会返回不同值,根据是数组还是object再次递归
function deppClone (origin, target) { // origin是被克隆的对象, target是克隆到的对象
var toStr = Object.prototype.toString, // 先定义出来 免得下面调用的时候写很长的名字
arryStrName = '[object Array]' // 这个是当数组的时候toStr返回的值
for(var prop in origin) { // 遍历
if (origin.hasOwnProperty(prop)) { // 检测是否有这个属性在本对象中
if (origin[prop] !== 'null' && typeof(origin[prop]) === 'object') { // null 和 array 使用typeof都返回object 这里只需要数组 去掉null
target[prop] = (toStr.call(origin[prop]) === arryStrName) ? [] : {} // 根据情况初始化
deppClone(origin[prop], target[prop]) // 如果是引用那么调用这个来递归
} else {
target[prop] = origin[prop] // 不是引用的话直接将值放入到target中
}
}
}
}
var a = {
arr: ['a'],
name: 'long',
age: 12
}
var b = {}
var b = deppClone(a, b)