首先拿到这个题目,咱们不能咔咔就开干,咱们要从里面看考点,知晓考点后,举一反三,以后遇到类似的问题才能从容淡定
首先,为什么会有深拷贝,这就涉及到了变量类型(值类型和引用类型),深拷贝是为了正确的拷贝引用类型。
那如何判断变量类型,这就涉及到了typeof的用法,拷贝引用类型的时候需要循环拷贝每个属性,这就涉及到了循环,如果引用类型有层级,需要递归执行
所以这个题目的考点有下面这些:变量类型、typeof、循环、递归
深拷贝实现如下:
// 深拷贝
const deepClone = (data: any) => {
// 值类型或者null,直接返回本身
if (typeof data !== 'object' || data === null) {
return data
}
let result: any // 拷贝后的对象或者数据
// 引用类型要分array和object,用isArray判断
if (Array.isArray(data)) {
result = []
} else {
result = {}
}
// for in循环可以数组也可以循环对象
for (let key in data) {
// 递归(因为数据层级可能是多层级的)
// 当data是数组时,key此时是索引,如果数组的每一项是object会继续递归执行
// 当data是对象,当某个对象是应用类型时会继续递归执行
result[key] = deepClone(data[key])
}
// 将拷贝后的对象返回
return result
}
接下来说一下考点:
一、变量类型
有值类型和引用类型
二、typeof
- typeof可以识别出所有的值类型
- 可以识别函数
- 可以判断是否是引用类型,但是无法对引用类型进行细分,这时候可以用Array.isArray()来判断是否是数组
三、循环
for in 循环的使用(可以循环对象,可以循环数组)
四、递归
递归是一种通过调用自身来解决问题的方法。在递归过程中,问题被分解成更小的子问题,然后通过反复调用函数本身来解决这些子问题,最终达到解决原始问题的目的