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;
            }
原文地址:https://www.cnblogs.com/huzhuhua/p/10215708.html