js 把一个对象赋值给另一个对象会指向同一个内存地址
先看一段代码:
var arr1 = [1,2,3];
var arr2 = arr1;
arr2.push(4);
console.log(arr1)//[1,2,3,4]
为什么会输出 的是[1,2,3,4]而不是[1,2,3]。
因为实际上并不是新建一个和原对象(数组也是对象)完全一样的对象,而是把原对象的内存地址直接复制给了另一个对象,也就是说两个对象都是指向同一个内存地址,所以实际上它们就是同一个对象。arr2更改的同时就是更改了arr1。好似你的钥匙(arr1)复制了一把(arr2)给别人,你可以把房门打开,别人那把也可以。你更改了房子(内存)里面的东西,别人打开也是看到你更改了的那个样子。
所以上面想分开只想操作arr2又不影响arr1,可以写为
var arr1 = [1,2,3];
var arr2 = [].concat(arr1);
arr2.push(4);
console.log(arr1)//[1,2,3]
同样的也有JSON等。
json里面有浅复制功能。比如:
let person1 = { name: "hhh", age: 14, phone: 145645645 } let person2 = {}; for (const key in person1) { person2[key] = person1[key] }
这种只能 是JSON key值 是字符串或者数字,布尔值这些。
如果JSON 里面有数组或者 再嵌套有obj类的也还是会共用内存。所以要深度克隆。
function cloneObj(obj) { var str, newobj = obj.constructor === Array ? [] : {}; if (typeof obj !== "object") { return; } else if (window.JSON) { str = JSON.stringify(obj);//序列化对象 newobj = JSON.parse(str); //还原 } else { //如果不支持以上方法 for (var i in obj) { newobj[i] = typeof obj[i] === "object" ? cloneObj(obj[i]) : obj[i]; } } return newobj; }