摘要:深拷贝概念并不新鲜,但是真正要真正理解原理还是有点难度的。这也是语言精粹之一吧。
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://www.ucloud.cn/yun/110283.html
摘要:防抖函数分为非立即执行版和立即执行版。返回值如果有元素被删除返回包含被删除项目的新数组。返回值的新长度。颠倒数组中元素的顺序语法参数无返回值颠倒后的新数组。如果为负值,表示倒数。停止填充位置默认为返回值返回当前数组。77777777777777777777777777777777777777777777777777777777777777777777777777 showImg(https:...
摘要:一篇文章彻底说清的深拷贝浅拷贝这篇文章的受众第一类业务需要急需知道如何深拷贝对象的开发者。这篇文章分享的目的更多还是希望用一篇文章整理清楚深浅拷贝的含义递归实现思路以及小伙伴们如果使用了这种黑科技一定要清楚这样写的优缺点。 一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者。 第二类,希望扎实JS基础,将来好去面试官前秀操作...
摘要:一篇文章彻底说清的深拷贝浅拷贝这篇文章的受众第一类业务需要急需知道如何深拷贝对象的开发者。这篇文章分享的目的更多还是希望用一篇文章整理清楚深浅拷贝的含义递归实现思路以及小伙伴们如果使用了这种黑科技一定要清楚这样写的优缺点。 一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者。 第二类,希望扎实JS基础,将来好去面试官前秀操作...
摘要:一篇文章彻底说清的深拷贝浅拷贝这篇文章的受众第一类业务需要急需知道如何深拷贝对象的开发者。这篇文章分享的目的更多还是希望用一篇文章整理清楚深浅拷贝的含义递归实现思路以及小伙伴们如果使用了这种黑科技一定要清楚这样写的优缺点。 一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者。 第二类,希望扎实JS基础,将来好去面试官前秀操作...
摘要:举个例子来说明一下什么是浅拷贝什么是深拷贝浅拷贝得出的结果可以看出是浅拷贝非对象的属性值一个改变不影响另一个的值对象属性是引用赋值所以一个改变会影响另一个的改变出现这种情况的本质是对象是按引用赋值的深拷贝指的是拷贝一个对象,改变一个值不影响 举个例子来说明一下什么是浅拷贝什么是深拷贝 浅拷贝 var x = { a: 1, b: {f: { g: 1 ...
阅读 963·2021-11-23 09:51
阅读 3443·2021-11-22 12:04
阅读 2700·2021-11-11 16:55
阅读 2863·2019-08-30 15:55
阅读 3185·2019-08-29 14:22
阅读 3334·2019-08-28 18:06
阅读 1219·2019-08-26 18:36
阅读 2108·2019-08-26 12:08