深拷贝(深度克隆)的特点:
拷贝的时候生成新数据,修改拷贝以后的数据不会影响原数据。
拷贝的数据里如果有对象或者数组,那么要继续遍历进行拷贝,除非该数据是数值类型,否则一直遍历进行拷贝。
先判断数据类型---获取最终当前的数据的类型到底是什么类型,才能够进行是否要遍历
// Array Object
let test=[];
console.log(Object.prototype.toString.call(test)) //[object Array]
let obj = {};
console.log(Object.prototype.toString.call(obj)) //[object Object]
// 根据得到的类型,判断是不是Object,判断是不是Array,如果都不是,直接复制即可
// 得到的是数据的类型
function targetType(target) {
return Object.prototype.toString.call(target).slice(8, -1)
}
// 如果数据是Object或者是Array 都要遍历,找到里面的每个数据是不是Object/Array,然后是否要继续遍历
function clone(target) {
// 进行克隆
let result, checkType = targetType(target); // 获取当前数据的类型的
// 判断
if (checkType === 'Object') {
result = {}
} else if (checkType === 'Array') {
result = []
} else {
return result
}
// 遍历进行克隆
for (let i in target) {
let value = target[i]
if (targetType(value) === 'Object' || targetType(value) === 'Array') {
result[i] = clone(value)
} else {
result[i] = value
}
}
// 最终把克隆后的数据要返回
return result;
}
// 深拷贝
let arr = [1, 2, [10, 20], { name: '小明', age: 100 }];
let result = clone(arr);
result[3]['name'] = '酷酷姐';
console.log(arr);
console.log(result);