JS如何深度复制对象和数组,避免指针变量引用修改值
//自定義深度復制對象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如何深度复制对象和数组,避免指针变量引用修改值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中Object类型和Array类型的
- 下一篇: 强哥原创管理方法论之“掌纹管理学”