定义:
无序的数据集合
键值对的集合
声明写法(2种):
let obj1 = {'name':'frank' , 'age':18}
let obj2 = new Object({'name':'frank','age':18})
console.log({'name':'frank','age':18}) // 匿名对象写法
键名细节:
Object.keys(对象)可以查看该对象的所有key
键名(key)就是每个对象的属性名(property)
键名是字符串,不是标识符,可以包含任何字符
就算引号省略了,键名依旧是字符串
如果键名为 1e2 或者1e-2,但并未加上引号,会先通过运算成100和-100,再变成字符串
如果键名是十六进制的数,但并未加上引号,会先转化成十进制,再变成字符串,如0xFF就是’255’
变量做属性名:
如果变量名不加[],不加[]的属性名会自动变成字符串
加了[]则会当做是引用变量的值来当属性名
如果变量的值不是字符串,会自动变成字符串
对象的隐藏属性:
JS中的每一个对象都有一个隐藏属性
这个隐藏属性储存着其共有属性组成的对象地址
这个共有属性组成的对象就是原型
也就是说,隐藏属性储存着原型的地址
属性名的增删改查:
删除属性:
delete obj.xxx 或 delete obj[‘xxx’]
即可删除obj的xxx属性
注:请区分属性值为undifined和不含属性名
一个对象是否有属性名
‘xxx’ in obj 可以判断 obj有没有xxx的属性
含有属性名,但是值为undefined
‘xxx’ in obj && obj.xxx === undefined的值为true
注意: obj.xxx===undefined 不能确定’xxx’是否为obj的属性,因为当obj没有xxx属性是,该值仍然为true
查看所有属性(读属性)
查看自身属性:
查看自身+共有属性:
判断一个属性是共有的还是自身的:
obj.hasOwnProperty(‘toString’)
查看属性值:
obj[‘属性名’]或obj.属性名或obj[变量名]
注意:obj[key]和obj[‘key’]不是同一个东西
修改或增加属性
直接赋值:
let obj = {‘name’: ‘frank’}
let obj[‘age’] = 18
修改属性:
批量赋值:
Object.assign(obj,{‘gender’:’man’ ,’age’: 18})
改共有属性:
obj.proto[‘toString’]=’xxx’
Object.prototype[‘toString’]=’xxx’
原型:
- 每个对象都有原型,原型里存着对象的共有属性
- 比如obj的原型就是一个对象,obj.proto这个属性里存着这个这个对象的地址
- 这个对象里有toString/constructor/valueOf等属性
- 对象的原型也是对象
- 所有对象的原型也有原型
- obj={}的原型即为所有对象的原型
- 这个原型所包含的对象的的共有属性,是对象的根
- 这个原型也有原型,是null
改原型:
不推荐使用proto
推荐使用Object.create ```javascript let obj = Object.create(common) obj.name = ‘frank’ let obj2 = Object.create(common) obj2.name = ‘jack’let obj = {'name':'frank'}
let obj2 = {'name': 'jack'}
let common = {'kind': 'human'}
obj.__proto__ = common
obj2.__proto__ = common
``` 注:所有proto代码都是强烈不推荐写的
‘name’ in obj 和 obj.hasOwnProperty(‘name’)区别
name’ in obj 查看’name’属性是否存在于obj对象里
obj.hasOwnProperty(‘name’) 查看’name’属性是否为obj对象私有的