经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
面试遇到的坑JS深拷贝和浅拷贝
来源:cnblogs  作者:一杯咖啡钱  时间:2021/5/24 10:52:31  对本文有异议

首先要搞明白深拷贝和钱拷贝的区别要先搞明白 栈和堆的区别

一、栈

  栈存储基础数据类型,如: String、Number、Boolean、Null、Underined,这些简单的基础数据类型能够直接存储在栈中。栈如果没有被使用就会被回收

二、堆

  堆存储引用数据类型的是 Function、Array、Object,在栈内存中存储着指向堆的地址和C语言的指针有点像,基本类型在当前执行环境结束时销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃圾回收机制回收。

  

 

 

 

 

 

 三、深拷贝和浅拷贝

  

  1. function copy(obj){
  2. let result = {}
  3. for(var key in obj){
  4. result[key]=obj[key];
  5. }
  6. return result
  7. }
  8. var oldObj = {name: 'Tom', age: 18, colors:['blue','pink']}
  9. var newObj = copy(oldObj)

上面这个代码 oldObj有两个基本属性 name、age  一个引用数据属性colors,但newObj拷贝后 name,age属性会被正常的拷贝,而colors属性,只会进行引用拷贝,这样会导致oldObj和newObj共用一个colors属性.这样就是所谓的浅拷贝。

 

  1. const oldObj = {
  2. name: '张三',
  3. age: 20,
  4. colors: ['yellow','orange']
  5. }
  6. function deepClone(obj){
  7. if (typeof obj !== 'object' || obj == null){
  8. return obj;
  9. }
  10. let result;
  11. if (obj instanceof Array){
  12. result = []
  13. } else {
  14. result = {}
  15. }
  16. for(var key in obj) {
  17. if (obj.hasOwnProperty(key)){
  18. result[key] = deepClone(obj[key]);
  19. }
  20. }
  21. return result;
  22. }
  23. const newObj = deepClone(oldObj);
  24. newObj.name = '李四';
  25. newObj.colors[0] = 'pink';
  26. console.log(oldObj)
  27. console.log(newObj)

上面这个代码  result[key] = deepClone(obj[key]);  deepClone()的回调函数,是为了拷贝colors里面的数据,

原文链接:http://www.cnblogs.com/coderatian/p/14785731.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号