定义
无序的数据集合
键值对的集合
写法:let obj = {'name': 'frank','age':18}
属性名
奇怪的属性名
所有属性名会自动变成字符串
如
let obj = {
1:'a',
3.2: 'b',
le2:true,
le-2:true,
.234:true,
0xFF:true
}
Object.keys(obj) 为 ["1","100","255","3.2","0.01","0.234"]
Object.keys(obj)可以得到obj的所有key
变量用作属性名
如
let p1='name'
let obj = {p1:'frank'};//属性名为'p1'
let obj = {[p1]:'frank'};//属性名为'name'
对比
不加[]的属性名会自动变成字符串
加了[]则会当作变量求值
值如果不是字符串,则会自动变成字符串
对象的增删查改
删除属性
delet obj.xxx 或者 delete obj[xxx]
即可删除obj的xxx属性
区分:
let obj = {name:'frank',age:18}
let obj.name=undefine
delete obj.name
设置属性值设为undefined,属性名还是存在对象中
用delete删除,对象中不含有属性名
检测对象是否含有属性名
'xxx' in obj === false
含有属性名,但是值为undefined
'xxx' in obj && obj.xxx === undefined
注意 obj.xxx === undefined;不能断定'xxx'是否为obj的属性
查看属性
- Object.keys(obj)
- console.dir(obj) 或者 依次用Object.keys打印出obj.proto
判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
<'xxx' in obj与obj.hasOwnProperty('xxx')的区别
'xxx' in obj检测obj使用检索到xxx属性,包括自己的属性和共有属性;
obj.hasOwnProperty('xxx')自检测自己有没有xxx属性,不包括共有属性
访问单个属性值
obj['key']
obj.key
obj.[key]
修改或增加属性(写属性)
- 直接赋值
let obj={name:'frank'} //name是字符串
obj.name='frank'//name是字符串
obj['name']='frank'//name是字符串
obj['na'+'me']='frank'
let key='name';obj[key]='frank'//key是变量
- 批量赋值
Object.assign(obj,{age:18,gender:'man'})
- 修改或增加共有属性
无法通过自身修改或增加共有属性
例如
let obj={},obj2={}//共有toString
obj.toString='xxx'//只会改obj的自身属性
obj2.toString 还是在原型上
- 如何修改或增加原型上的属性
obj.__proto__.toString = 'xxx' //不推荐使用__proto__
Object.prototype.toString='xxx'
- 修改隐藏属性
不推荐使用__proto__
例如
let obj={name:'frank'}
let obj2={nmae:'jack'}
let common={kind:'human'}
obj.__proto__=common
obj2.__proto__=common
内存图
推荐使用Object.create
let obj=Object.create(common) //以common为原型创建对象