JavaScript(六)-对象

    科技2022-09-07  113

    //1.定义对象 var obj={a:1,b:2}; //a是obj的key //1是obj的key属性的value; //键值对key-value; //2.给对象的key赋值 obj.a=10;//直接定义对象obj的属性a的值是10 //3.给对象添加新属性(方法一) obj.c=20;//现在给obj对象创建一个新属性c,并且设置这个新属性的值是20 //打印属性值(方法一) console.log(obj.c); //4.给对象添加新属性(方法二) obj["d"]=30;//即obj.d=30; //打印属性值(方法二) console.log(obj["d"]);//即cosole.log(obj.d);

    对象属性有两种写法: (1)点语法 (2)中括号[]的写法 区别: 1.obj.a 点语法是不需要双引号 obj[“a”] key的写法必须有双引号 //为什么要有双引号? 在这种写法时,要求属性名必须是字符型(或symbol型)

    var a="ab"; obj[a]=40; //这里a是变量,可以理解为将"ab"的字符串作为obj的属性 console.log(obj.ab);

    那么什么时候加双引号? 属性是字符串的时候就需要加双引号,是变量就不需要加双引号

    var s="眼睛"; 小明[s]=2; 小明["眼睛"]=2; 小明.s=2;//这里使用点语法时不能使用变量 //这种写法会造成给小明添加s属性,他的值是2,并没有添加眼睛属性 var obj={a:1,b:2}; var o="a"; console.log(obj[o]);//1 console.log(obj.o);//undefined var o="a"; console.log(obj[o]);//1,o没有加双引号是变量 console.log(obj["o"]);//3,o是字符串 console.log(obj.o);//3,点语法,不能加变量,所以不需要双引号,默认是o属性 var n=9; obj[n]=100;//如果变量的值不是字符,会隐式转换为字符,会将n的值转换为字符9,设置为属性 var m=true; obj[m]=10;//这里会将任何变量不是字符串的隐式转换为字符串

    当使用对象[变量],如果变量不是字符型,会隐式转换为字符型,并且将这个字符串作为该对象的属性名;

    var o={a:1}; var o1={b:2}; var o2={}; o2[o]=10;//o转换为字符串时是"[object Object]" o2[o1]=20;//o2转换为字符串时是"[object Object]",则会覆盖 console.log(o2[o]);//20

    遍历对象

    var obj={ a:1, b:2, c:3, d:4, e:undefined } console.log("e" in obj);//e是不是obj的属性名 for(var prop in obj){ // 将所有obj中的属性名分别赋值给prop这个变量 console.log(prop);//key console.log(obj[prop]);//value }

    运行结果: js中的对象遍历是根据对象属性添加的先后来遍历,对象遍历是有顺序的

    var o={f:10,g:20}; for(var prop in obj){ o[prop]=obj[prop]; } console.log(o);

    即:

    o=Object.assign(o,obj);//用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。o是目标对象,obj是源对象

    JSON串

    var obj={a:1}; console.log(obj); var str=JSON.stringify(obj); console.log(str);

    1.JSON.stringify(obj)//转为JSON串 运行结果: 2.JSON串转换为对象

    var s='{"b":2}'; var o=JSON.parse(s);//将JSON字符串转换为对象 console.log(o);

    运行结果

    堆和栈

    1、栈的数据读取、写入速度较快,但是存储的内容较少 2、堆的读取和写入速度较慢,但是存储的内容较多 内存 硬盘 重启电脑内存就会清除 3、字符型、数值型、布尔型、undefined存在栈中; 4、对象存储在堆中; 5、栈中,一旦该变量不再使用则会被清理掉 6、当点击对象前面的箭头时,才去堆中对应的地址去取数据 7、引用地址就是指堆中对象存储的地址

    内存泄漏:对象的引用列表中变量并没有清除掉引用关系,因此就不会被垃圾回收机车回收

    var obj={a:1}; obj=3; //{a:1}的引用列表中仍然是obj //obj已经是新的值3了,于是没有任何方法在获得{a:1} //这个对象也就不会被回收了 obj=null;//在{a:1}的引用中删除了obj的引用 //obj=3;重新给obj赋值给3; //当内存占用到一定的时候,就会有一个垃圾回收车将所有堆中没有引用关系的对象回收 var obj={a:1}; var obj2={a:1}; //当使用{a:1}这就是在堆中创建了一个新的对象,就会有一个的新的引用地址 //上面两个{a:1}相当于创建了两个对象,他们的引用地址是不同的 console.log(obj===obj2);//false

    删除属性

    var o={a:1}; o.b=10; delete o.a;//删除属性 console.log(o); var obj={ a:1, b:2, c:{ d:10, e:20 } } // 浅复制 // var o1={}; // for(var prop in obj){ // o1[prop]=obj[prop]; // } // var o1=obj; // obj.a=10; // obj.c.d=100; // console.log(o1); // 深复制 var o1=JSON.parse(JSON.stringify(obj)); obj.c.d=100; console.log(o1);
    Processed: 0.014, SQL: 9