1.对象的表现形式
var obj={ a:1, b:2, }
如上,obj就是对象。 以键值对(key:value)的形式出现
2.对象的特点
var s="h"; var s1=10; var obj={ a:1, b:2, c:s1, [s]:3 };
如上: 1.键(key) 是字符串
2.key可以是变量,但是必须放在[]里面,像上面的[s]:3,实际代表的是h:3
3.value可以是字符串,数值,变量,函数.....
3.对象的赋值方法
var obj={}; obj.a=10;
obj["a"]=10; 二者相同
var s="a";
obj[s]=10; 和上面的相同;
总结:对象的赋值方法有两种: 1)字符串赋值,变量赋值
!设置属性时,会隐形的转换为字符串。
var obj={}; var s=1; obj[s]=10; console.log(obj[s]); console.log(obj["1"]); console.log(obj["1"]); 结果: 10 10 10 可以看到,数值1,转换成了字符串,是obj的属性
感觉很抽象,再来个例子
var obj={}; var o={a:1}; var o1={a:2}; obj[o]=10; console.log(obj); console.log(obj[o]); console.log(obj[o1]); 结果: {[object Object]: 10} 10 10
解释下为什么: 前面的数据类型那章介绍过,对象的类型是[object Object ] ,所以obj[o] 的键是[object Object ] 。 obj[o] 和obj[o1] 的键是一样的,(只要[] 里放的是对象,那么键都是一样的),所以value都是10.
有不懂得话,在举个例子
var obj={}; var arr=[1,2,3]; var arr1=[]; obj[arr]=10; console.log(obj[arr1]) 结果: undefined
解释:数组转换成字符串是"1,2,3",所以obj[arr]=10实际上是 obj["1,2,3"]=10; 而arr1是空数组,没有赋值,所以打印结果是undefined
4.对象的遍历
遍历分为可枚举属性,和不可枚举属性,这里我只说可以枚举属性的遍历。
对象的可枚举属性的遍历使用for in 语句
var obj={a:1,b:2,c:3,d:undefined}; for (var prop in obj){ console.log(prop,obj[prop]) } 结果是: a 1 b 2 c 3
prop是对象的key,obj[prop] 是对象的value
说一下判断对象中有无此属性:
console.log("d" in obj) 结果是: true
5.对象中属性的删除
var obj={a:1,b:2,c:3,d:undefined,e:{f:5,g:6}}; delete obj.a; console.log(obj);
直接使用delete只能删除单层的结构,如果是多层:
var obj={a:1,b:2,c:3,d:undefined,e:{f:5,g:6}}; obj.e=null; delete obj.e; console.log(obj);
对于多层的话,必须设置null,否则会造成内存泄漏
关于堆栈存储,内存泄漏,垃圾清理 我会在后面单独拿出来写。
6.对象的复制
1)浅复制
var obj={a:1,b:2,c:3,d:undefined,e:{a:1,b:2}}; var obj1={}; for(var prop in obj){ obj1[prop]=obj[prop]; }
缺点:e的地址还是一样,改变一个,另外一个中的e也会改变,适用于单层的对象结构
2)浅复制
var o={a:1,b:2,c:3}; var o1={c:5,d:10,e:20}; var obj=Object.assign({},o,o1); console.log(obj);
适用于多个对象复制到一个对象里面。
3)深复制
var obj={a:1,b:2,c:3,d:undefined,e:{a:1,b:2}}; var obj1={}; var obj1=JSON.parse(JSON.stringify(obj)); console.log(obj1)
这里使用了JSON字符串,只适用于单层的对象结构,多层的深度遍历,复制我会单独写