为什么要写呢?因为今晚点了一杯美式咖啡,晚上肯定睡不着,先挖个坑,12点以后来填。
下面代码是浅复制,非常简单,
const a = {
i: {
speak: {
javascript: 'yes'
}
}
};
const b = {};
b = a; // 浅复制,如此简单
一直对这个概念很困惑,这该不会是谁造出来的概念?运用递归函数思想,for...in...获取所有可枚举属性,那么不可枚举属性又如何? 所谓深复制连最后一层原型指向new Object()也要一起递归复制么?mmp,谁会没事去整一个属性如此复杂的对象。
正是因为有这两种不同的东西,所以我们才需要针对他们来区分是否直接复制,还是去递归他的子属性,进而复制它的子属性。 针对上述概念,直接写出深复制函数的核心代码。
if((typeof c === Object){
// 继续去查找他的自属性,直到找到原始类型:Number,String,Boolean,undefined,null,NaN,Symbol
deepClone(c[key], a[key])
}else{
// 直接复制
a = b
}
简单实现深复制,暂时不考虑不可枚举对象以及数组对象
const a = [
i: {
am : {
not: {
good:'123'
}
}
},
but:{
i: {
do: {
not: {
know : {
why:14
}
}
}
}
}
]
const b={};
const deepClone = (a,b) =>{
Object.keys(a).forEach((i) =>{
if(typeof a[i] === 'object') {
if(a[i].constructor === Array){
b[i] = []
}else{
b[i] = {}
}
deepClone(a[i], b[i])
} else {
a[i] = b[i]
}
})
}
deepClone(a,b)