//自定义深度复制对象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);

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

如上图所示这样复制对象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);

JS如何深度复制对象和数组,避免指针变量引用修改值_JSON.parse_02

实验结果完美!

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

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

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


JS如何深度复制对象和数组,避免指针变量引用修改值_JSON.parse_04