原生JS实现对象数组深拷贝已经是一个老生常谈的面试题了,下面我将方法总结出来
//设置一个检查类型的函数
function checkType(target) {
return Object.prototype.toString.call(target).slice(8,-1)
}
//递归遍历对象/数组元素。实现深拷贝
function clone(target) {
//初始化一个result,作为将来要输出的结果
//我们先检查将要进行拷贝的数据类型是对象还是数组,来进行不同的初始化赋值
let result
let targetType = checkType(target)
if(targetType === 'Object') {
result = {}
}else if (targetType === 'Array') {
result = []
}else {
//如果不是对象或者数组就直接我们输出输入的值,因为只有对象或数组才存在深拷贝
return target
}
for( let i in target ) {
let value = target[i]
//使用for ... in 循环遍历其下标,通过target[i]拿到当前出去迭代中的值
//再通过上面定义的类型检查方法判断每一项的类型
//如果是对象或者数组,接着对该属性进行遍历。如果不是,就将该值赋给result的同一下标下。
if(checkType(value) === 'Object' || checkType(value) === 'Array') {
result[i] = clone(value)
}else {
result[i] = value
}
}
//最后输出result,达到深拷贝的目的
return result
}