//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);