js_对象

44 阅读3分钟

js基础知识和误区

        var o={};
        var s=1;
        o[s]=30;
        o["s"]=40;
        o.s=50;
        console.log('o', o)

输出结果{1:30,s:50},o.s=50改变的是o["s"]=40,因为其中的s属于字符串。 在var s=5;时里边的s属于变量变为 o[5]=30;

        var d;
        o[d]=10;
        console.log(o.d);
        console.log(o.undefined);

第一个输出结果为undefined,因为点于法的d属于字符串,与上方的并不相同,所以无定义 第二的输出结果为10

        var d={a:1};
        o[d]=5;
        console.log(String({a:1}),String({b:3})); //两者都为对象object
        console.log(o[{b:3}]);

答案是5,第一步需要把d转换为字符串,结果为object,而下方的{b:3}转换为字符串也是object, 带入后等于5

对象的存储一共有两种情况,一种是存储数据,一种是存储函数,存储数据的叫做对象的属性,存储函数叫做对象的方法

console.log("a" in o); 就是判断o对象里有没有a这个key

        var o = {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        }

        for(var prop in o){
            console.log(prop);
        }
        console.log(prop,o[prop]);
       定义prop这个变量,遍历每个key并输出

遍历键值对,现在prop是变量,不能用点于法, 如果键是一个变量,不能使用.语法,必须使用[]带入变量

    var a=String.fromCharCode(122);
    console.log(a);

将ascii转换为字符 97-122就是小写字母a-z

对象中存储的内容 相互之间是没有关联的

     var o={a:1};
     console.log(o);

堆里面有一个对象所存的引用地址,首先在堆里面建立以对象o,然后在栈里边开辟了一个变量o,变量o存储了一个值,就是对象o在堆中的引用地址,当console.log打印时,只将栈中的o打印出来,当打印o时,地址由于太多,将地址简化写成object,当点击object时,就是在堆中查找对象

    var o={a:1};
    console.log(o);
    o.a=2;

当打开页面时,程序已经执行完毕,显示的还是对象object,点击时o对象变为了{o:2},点击刷新时,页面就处于卸载过程,重新打开页面时,有缓存机制调用,将打印时的数据存放在缓存当中,也就是{a:1},然后再继续向下执行,点击箭头后,出现了{a:2}显示时打印的对象可能已经发生变化

    {a:1,b:{c:1}}

此时{c:1}也存放在堆中,在b中只是存放了一个地址

        var o={a:1};
        var o1=o;
        o1.a=10;
        console.log(o.a);

输出结果为10 因为o和o1引用地址一样,这种方式是赋值了引用地址,修改任何一个,另一个看到的也是被修改后的结果

浅复制

        var o={a:1,b:2};
        var o1={};

        for(var prop in o){
            o1[prop]=o[prop];
        }

        o.b=10;
        console.log(o1);

o和o1是两个对象,在将o中的每个属性赋值给o1后,对o进行修改,不会影响o1的值

        var o={a:1,b:2,c:{d:1,e:10}};
        var o1={};

        for(var prop in o){
            o1[prop]=o[prop];
        }

        o.a=10;
        o.c.d=10;
        console.log(o1);

当对象里面包含对象时,在复制时将引用地址也赋值了过去,所以对c中 d和e的改变,就是对引用地址进行改变