- 对象:无序的数据集合 键值对的集合
- 属性名:每个key都是对象的属性名(property)
- 属性值:每个value都是对象的属性值
- 原型(共有属性):JS中每个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址,这个共有属性组成的对象叫做原型,也就是说隐藏属性储存着原型地址
let obj ={} obj.toString()
1, 声明对象的两种语法
简写:let obj = {'name':'frank','age':18}
正规写法:let obj = new Object({'name':'frank'})
注意细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略后只能写标识符
- 就算引号省略,键名也还是字符串(自动变成字符串)
2, 如何删除对象的属性
delete obj.xxx或 delete obj['xxx']即可删除obj的xxx属性
注意区分属性值为undefined和不含属性名:
- 'xxx'in obj === false(false表示不含属性名)
- 'xxx'in obj && obj.xxx === undefined(含属性名但是值为undefined)
- 类比:你有没有纸?
- A:没有/不含属性名
- B:有,但没带/含有属性名 但值为undefined
3, 如何查看对象的属性
查看自身所有属性:
Object.keys(obj)keys就是把所有key打开
Object.values(obj)就是把所有值打开
Object.entries(obj)就是把所有keys和values都打开
查看自身+共有属性:
console.dir(obj)以目录的形式打出来
判断一个属性是自身还是共有的
obj.hasOwnProperty('toString')hasOwnProperty翻译为:拥有自己的属性 有的话为true,没有为false
查看单个属性
两种方法查看:
中括号语法:obj['name'],请优先使用这种写法
点语法:obj.name //记住这里的name是字符串,因为点语法会误导你,以为name不是字符型串,等你确定不会弄混两种语法,再用点语法
4, 如何修改或增加对象的属性
单个属性修改和增加操作相似,通过直接赋值:
let obj = {name:'frank'} //name是字符串
obj.name = 'frank' //name是字符串 通过“=”进行赋值
obj['name'] = 'frank' //通过中括号直接赋值(直接修改了)
批量属性修改,通过Object.assign(obj, {p1,p2,p3,p4}),将p1,p2,p3,p4赋值给obj,然后打印(assign:赋值)
'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj表示对象是否含有属性name,把name作为字符串in obj,如果是false表示不含name属性,ture表示包含name属性
但是 'name' in obj有个问题,就是无法判断这个属性是自己的还是原型上共有的,那怎么判断呢?
obj.hasOwnProperty('name'):每个对象都有这个hasOwnProperty(翻译为:拥有自己的属性),后面加属性名,用于判断这个属性是自身的还是共有的:如果是false就说明这个属性不是他自身的(有可能原型上的,有可能就是没有),只有他自身有这个属性会返回ture。