手撸一个JS深拷贝函数
JS深拷贝概念并不新鲜,但是真正要真正理解原理还是有点难度的。这也是JS语言精粹之一吧。
例子
let a = { name: 'demo', age: 18 }; let b = a; b.name = 'demo1'; console.log(a); // 输出 {name: "demo1", age: 18} console.log(b); // 输出 {name: "demo1", age: 18}
因为JS对于对象的赋值使用的是浅拷贝,其中一个实例变量
的赋值会影响到所有指向该对象
的变量
解决方案
- 粗暴好使的
JSON.parse(JSON.stringify)
,缺点:丢失成员函数
-
Object.assign
,缺点:只有第一级深拷贝,子级对象依旧是浅拷贝
,例子如下:let a = {name:{demo:'1'}}; let b = Object.assign({}, a); console.log(a); // 输出 {name:{demo:'1'}} console.log(b); // 输出 {name:{demo:'1'}} b.name.demo = '2'; console.log(a); // 输出 {name:{demo:'2'}} console.log(b); // 输出 {name:{demo:'2'}}
手动实现原理
- 遍历待拷贝对象
- 判断当前值类型,如果是object类型且不是null(null也是object),则递归调用拷贝函数
- 如果当前值类型时null或者非object类型,直接return,退出本次递归
编码实现
function deepCopy(obj) { let result = obj; if(typeof obj === 'object' && obj !== null) { result = Object.prototype.toString.call(obj) === '[object Array]' ? []: {}; for(let prop in obj) { result[prop] = deepCopy(obj[prop]); } } return result; }
验证一下:
let a = {name:{demo:'1'}}; let b = deepCopy(a); console.log(a); // 输出 {name:{demo:'1'}} console.log(b); // 输出 {name:{demo:'1'}} b.name.demo = '2'; console.log(a); // 输出 {name:{demo:'1'}} console.log(b); // 输出 {name:{demo:'2'}}
更多精彩内容尽在我的博客一键直达
原文地址:https://segmentfault.com/a/1190000019776036
相关推荐
-
web交互方式—ajax javascript/jquery
2019-7-8
-
《前端每日实战》第171号作品:用纯 CSS 绘制一朵美丽的雪花 javascript/jquery
2020-6-10
-
windows下安装node环境 javascript/jquery
2020-6-15
-
讲解开源项目:功能强大的 JS 文件上传库 javascript/jquery
2019-10-4
-
使用vue2+Vuex+Router重写饿了么点餐系统和vue插件简析 javascript/jquery
2020-6-9
-
探究JS中的连等赋值问题 javascript/jquery
2019-5-15
-
开发常用的在线工具 javascript/jquery
2019-5-3
-
图算法 – 只需“五步” ,获取两节点间的所有路径(非递归方式) javascript/jquery
2019-10-2
-
Vue 底层编译实现 javascript/jquery
2020-6-16
-
react服务端渲染详解(1) javascript/jquery
2020-5-24