对象
写法定义
var obj={a:1,b:2};
a是obj的key
1是obj的key属性a的value
整个对象属性称为键值对
obj.a=10;
直接定义对象obj的属性a的值是10
对象内没有c值obj.c=20;的写法是
现在给obj对象创建一个新属性c,并且设置这个新属性的值是20
[ ]写法
obj["c"]和obj.c是等同的,只不过obj.c是点语法的写法,而且点语法的属性是不加双引号,obj["a"] key的写法,必须有双引号
为什么key的写法必须有双引号,在key这种写法时,要求属性名必须时字符型(或者symbol后面学)
在对象里没有属性时
如果对象上没有我们要打印或者定义的属性时,显示结果是undefined
写法案例解析
var obj={a:1,b:2,o:3};
var o="a";
console.log(obj[o]);
这里的o没有加双引号,因此是变量 1
console.log(obj["o"]);
3 这里获取了obj的o属性
console.log(obj.o);
使用点语法时不能使用变量,所以不需要加双引号,默认为是o属性 3
在[ ]中如果定义不是字符将隐式转换为字符
var n=9;
obj[n]=100;//如果变量的值不是字符,会隐式转换为字符,会将n的值转换为字符9设置为属性
var m=true;
obj[m]=10;//这里会将变量值不是字符串的隐式全部转为字符串
空值转换后将会变为undefined
var n;
var m;
obj[n]=10;
n的值是undefined,会自动隐式转换为字符串undefined
变量的值作为对象的属性名
console.log(obj[m]);
console.log(obj["undefined"]);
obj["undefined"]
console.log(n);
当使用对象[变量] 如果变量值不是字符型,
会隐式转换为字符型,并且将这个字符串作为该对象的属性名
任何对象强转为字符串后,都会变为"[object Object]"
对象是什么,存储在哪里
栈,堆
栈的数据读取,写入速度快,但是存储的内容较少
堆的读取和写入速度慢,但是存储的内容多
字符型,数值型,布尔型,undefined存在栈中
对象是存储在堆中
栈中,一旦该变量不再使用时会被清理掉
当点击对象前面的箭头时,才去堆中对应的地址取出数据
引用地址就是指堆中对象存储的地址
对象的引用地址赋值
var o={a:1};
var o1=o;
将o对象的引用地址赋值给o1
o1.a=10;
因为o1和o是同一个对象,因此修改o1的属性就相当于修改了o的属性
重新改变新地址
var o={a:1};
var o1=o;
o={b:2}; 重新改变新地址
o.a=20; 在新的对象中添加属性
在对象改变地址或者从新定义后,原对象属性需要被回收,清理空间
obj=null; //在原先对象属性中的引用地址中删除了obj的引用
当内存占用达到一定的时候,就会有一个垃圾回收车将所有堆中没有引用关系的对象回收掉