• 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;
                }
  • 相关阅读:
    使用Session防止表单重复提交
    Session
    使用Cookie进行会话管理
    Java邻接表表示加权有向图,附dijkstra最短路径算法
    web工程中URL地址的推荐写法
    Web工程中各类地址的写法
    HTTP中的重定向和请求转发的区别
    squid代理
    代理服务 squid 隐藏真实ip,也就是透明代理
    docker添加sshd 服务
  • 原文地址:https://www.cnblogs.com/huzhuhua/p/10215708.html
Copyright © 2020-2023  润新知