JS如何深度复制对象和数组,避免指针变量引用修改值
原创
©著作权归作者所有:来自51CTO博客作者挚爱的强哥的原创作品,请联系作者获取转载授权,否则将追究法律责任
//自定义深度复制对象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 ))完全无需额外定义方法,最原汁原味的骚操作!
这样复制一下,你的对象就不再是以前的对象,你的数组也不再是以前的数组了!!!