//自定义深度复制对象or数组的递归方法----------------------------------------
let copyObjOrArr = o => {let isArray = o instanceof Array;let isObject = o instanceof Object;if (!isObject) return o;     let n = (isArray ? [] : {});for (let k in o) n[k] = copyObjOrArr(o[k]);     return n;
}//测试----------------------------------------var obj={a:1};
var arr=[1,2,3];
var obj_new =copyObjOrArr(obj);
var arr_new =copyObjOrArr(arr);console.log(obj_new);
console.log(arr_new);

如上图所示这样复制对象or数组就不会产生指针变量那种修改的情况了


BUT!

我依然觉得上面的代码肽冗余,本质上我们只要复制了内容,并且保证变量指向的内存地址也发生改变就可以了

此刻,我想起了JSON.parse(JSON.stringify( objectOrArray )),这个把对象转为字符串再反转为对象的过程,就可以完成一次内存地址变更,于是有了代码

var obj={a:1};
var arr=[1,2,3];
var obj_new = JSON.parse(JSON.stringify( obj ));
var arr_new = JSON.parse(JSON.stringify( arr ));//测试----------------------------------------var obj={a:1};
var arr=[1,2,3];
var obj_new =copyObjOrArr(obj);
var arr_new =copyObjOrArr(arr);console.log(obj_new);
console.log(arr_new);

实验结果完美!

JSON.parse(JSON.stringify( objectOrArray ))完全无需额外定义方法,最原汁原味的骚操作!

这样复制一下,你的对象就不再是以前的对象,你的数组也不再是以前的数组了!!!



那么问题来了,为啥不这样操作,就会导致变量修改了会影响被复制的变量值呢?js中Object类型和Array类型的变量被赋值(复制)给其他变量后,修改被赋值(复制)的新变量的值,会影响原始变量的值,这是为什么呢?_你挚爱的强哥❤给你发来1条消息❤-CSDN博客JavaScript中的Object和Array都是指针变量类型,例如我声明let obj={a:1};let arr=[1,2,3];其中的obj和arr存放的仅仅是对应的对象和数组内容所存放的内存地址值当你用以下代码赋值给另外的新变量的时候let obj={a:1};let arr=[1,2,3];let obj_new=obj;let arr_new=arr;我们对 obj_new 和 arr_new 的内容进行修改,原始的 obj 和 arr 变量的值也会https://s-z-q.blog.csdn.net/article/details/121134588

JS如何深度复制对象和数组,避免指针变量引用修改值相关推荐

  1. c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...

  2. C程序设计基础之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示.    在前面曾经介 ...

  3. 面试中常被问到(四)C/C++中数组,指针和引用的区别

    C/C++中数组,指针和引用的区别 数组和指针: 数组 指针 保存数据 保存数据地址 可直接访问元素的值 间接访问(首先获取指针内容作为地址,通过寻址找到元素的值) 一般大小固定,数据类型相同 一般用 ...

  4. JS:js中的复制对象值问题——Object.assign()

    在复制对象的值的时候,往往不能直接"=",这样会造成引用赋值,应该利用一些函数进行对象的复制值.如下: $scope.updateDeliveryOrder = function( ...

  5. js函数调用html对象参数传递参数吗,js里函数参数传递对象传的是指针吗

    js高程 page88在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是arguments 对象中的一个元素).在向参数传递引用类型 ...

  6. Qt的json对象不具备类似指针、引用的行为导致的更新不成功问题解决

    如下代码: QJsonArray actionsArray; QJsonObject totalRootJson; totalRootJson.insert("actionsArray&qu ...

  7. C语言 数组的指针和指向数组的指针变量

    一.回顾二维数组和多维数组的概念 int a[3][4];  //二维数组 int a[2][3]4];  //多维数组 二.指向多维数组的指针和指针变量的探究 可以把a看成是一个一维数组,这个一维数 ...

  8. C语言 数组的指针和指向数组的指针变量-2

    一.数组名作为函数参数 如果一个实参的数组,想在函数中改变此数组的元素的值,实参和形参的对应关系可以有 4 种: (1)实参和形参都是数组名 a 是实参数组首地址,那么ba是形参数组首地址,a和ba共 ...

  9. 第三节 数组的指针和指向数组的指针变量

    目录 一.指向数组元素的指针变量的定义和赋值 二.通过指针引用数组元素 三.数组名作为函数参数 四.指向多维数组的指针和指针变量探究 五.指针数组和数组指针 一.指向数组元素的指针变量的定义和赋值 数 ...

最新文章

  1. Python 速度慢,试试这个方法提高 1000 倍
  2. 做一个快乐的产品经理
  3. python多次输入数据_如何用python3输出重复的数据?
  4. stringstream字符串流的妙用
  5. Android的HTTP方式网络通信---HttpURLConnection
  6. 怎么终止linux的次序运行程序,linux – 如何按特定顺序停止systemd服务
  7. Java并发编程原理与实战十一:锁重入自旋锁死锁
  8. 斗鱼tv 服务器响应失败,斗鱼tv打不开怎么办 斗鱼直播打不开得解决办法
  9. spdy_buffer
  10. 北京大学计算机系 丁主任,北大“扫地僧”韦东奕,真的是正常人吗?北大丁教授说出了答案...
  11. 儿童节html5小游戏,2016六一儿童节主题班会小游戏大全
  12. restTemplate访问接口
  13. 开源电子原型平台 Arduino
  14. Linux命令之bc命令
  15. 1D卷积网络HAR(人体活动识别)实践
  16. java组织树级结构
  17. android脚本 附近的人,前天微信上有个附近的人加我,我发现她是个脚本
  18. java计算机毕业设计绿色生活基于PS、DW的绿色环保宣传网站源程序+mysql+系统+lw文档+远程调试
  19. 面试复盘(数据分析)
  20. 计算机网络设备安装检验批,智能建筑工程分为哪些子分部工程与分项工程

热门文章

  1. 对python3中pathlib库的Path类的使用详解
  2. Eclipse里的文件搜索
  3. Jquery前端分页插件pagination同步加载和异步加载
  4. Intellij IDEA中开启Run Dashboard模式
  5. ng-cordova和cordova区别
  6. 做acm 需要学的算法
  7. web server大全之GoAhead移植(转载)
  8. 推荐一个关于.NET平台数据结构和算法的好项目
  9. pythontype函数使用_基础教程:python isinstance与type函数用法
  10. 回归 统计绘图_手把手教绘制回归分析结果的森林图「GraphPad Prism和Excel」