js之引用类型(探索js中是如何存放数据的)

388 阅读2分钟

引用类型

原始类型 引用类型(对象、函数)

变量之间的赋值是复制粘贴的过程,变量的新的值会替代旧的值

原始类型的变量,存放的具体的值

        var a = 123;
        var b = a;
        b = 234; //原始类型的变量存放的是具体的值
        console.log(a, b); // 123 234

引用类型的变量,存放的是内存地址

凡是出现对象字面量的位置,都一定在内存出现一个新的对象

        // obj1持有xx对象的引用
        // obj1指向xx对象
        var obj1 = {
            name: "123",
            age: 10
        }; //出现对象字面量,那么就会开辟一块新的内存空间。 用于存放对象的内容,叫做内存首地址

        var obj2 = obj1; // 将obj1的地址复制到obj2中 --》 obj1和obj2持有共同的引用 /obj1和obj2指向同一个对象
        obj2.name = "wjh";
        console.log(obj1.name, obj2.name); // "wjh" "wjh"  因为指向的是同一个对象 所以要变一起变
        var obj1 = {
            name: "123",
            age: 10
        };
        var obj2 = obj1;
        obj2 = {
            name: "456"
        }; // 遇到对象字面量 系统就会开辟一个新的内存空间
        console.log(obj1.name, obj2.name); // 123 456
        var user1 = {
            name: "u1",
            age: 10,
            address: {
                country: "中国",
                city: "上海"
            }
        };
        var user2 = {
            name: "u2",
            age: 20,
            address: user1.address // 属性中也是存放的地址 复制也是复制的地址 指向同一对象
        };
        user2.name = "user2";
        user2.address.city = "北京";
        console.log(user1.name, user2.name); // "u1" "user"
        console.log(user1.address.city, user2.address.city); // "北京" "北京"
        var obj1 = {
            a: "123",
            b: "456",
            sub: {
                s1: "abc",
                s2: "bcd"
            }
        };
        var temp = obj1.sub;
        var obj2 = obj1;
        obj2.sub = {
            s1: "s",
            s2: "ddd"
        };

        console.log(obj1.sub.s1, obj2.sub.s1, temp.s1);// s s abc
  • 原始类型当中俩个变量交换
        var a = 123;
        var b = 456;
        var temp = a;
        a = b;
        b = temp;
        console.log(a, b);
        var item = {
            name: "foo",
            parent: {
                name: "bar"
            },
            child: {
                name: "goo"
            }
        };
        // 将item的parent和child互换,不可创建新对象

        // item.parent  item.child
        var temp = item.parent;
        item.parent = item.child;
        item.child = temp;
  • 补充:在JS中,变量在使用时可以不写var

不写var直接赋值,相当于给window的某个属性直接赋值

        a = 1;
        console.log(a, window.a);
  • JS中的垃圾回收

垃圾回收器,会定期的发现内存中无法访问到的对象,该对象称之为垃圾,垃圾回收器会在合适的时间将其占用的内存释放。