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%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理