JS :手写深拷贝(递归实现)(*****五颗星)
1.手写深拷贝(不考虑symbol)
for in 不会遍历symbol类型的值。
<script>
function deepClone(cur) {
if(typeof cur!="object") return cur
let tar = cur instanceof Array?[]:{}
for (let k in cur) {//for in会遍历实例成员和原型成员
if (cur.hasOwnProperty(k)) {//判断是不是实例成员
if (typeof cur[k] === "object") {//引用类型和基本类型的判断,判断是不是object类型,不是数组就是对象
// tar[k]=Object.prototype.toString.call(cur[k])==="[object Array]"?[]:{}//数组对象的判断
tar[k] = Array.isArray(cur[k]) ? [] : {}//判断是否是数组类型
tar[k]=deepClone(cur[k])//递归调用的入口
} else {//出口
tar[k] = cur[k]//基本数据类型----直接拷贝
}
}
}
return tar
}
let c=Symbol("c")
let d=Symbol("d")
let obj1 = {
a: 1,
b: { a: 2 },
[c]:3,
[d]:4
};
let obj2 = deepClone(obj1);
obj2.b.a=11
console.log(obj1);
console.log(obj2);
</script>
2.手写深拷贝(考虑symbol)
Object.getOwnPropertySymbols(cur)可以获取symbol类型的内容
<script>
function deepClone(cur) {
if(typeof cur!="object") return cur
let tar = cur instanceof Array?[]:{}
//symbol类型的值拷贝
Object.getOwnPropertySymbols(cur).forEach(i=>{
tar[i]=cur[i]
})
//非symbol类型的值拷贝
for(let k in cur){
if(cur.hasOwnProperty(k)){
if(typeof cur[k]==="object"){
tar[k]=Array.isArray(cur[k])?[]:{}
tar[k]=deepClone(cur[k])
}else{
tar[k]=cur[k]
}
}
}
return tar
}
let obj1 = {
a: 1,
b: { a: 2 },
[Symbol("c")]:"cc",
[Symbol("d")]:4,
};
l
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理

查看26道真题和解析