对象属性有两种写法: (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运行结果: 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是源对象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