对象object 定义
- 无序的数据集合
- 键值对的集合
- 属性名:属性值
- 键名一定为字符串,不是标识符,可以包含任意字符
- 键名引号如果没有特殊字符(如中文)则可以省略,若省略了引号则为标识符
- 就算引号省略了也还是字符串
1.声明对象的两种语法
-
Let obj ={‘name’: ‘abc’,‘age’:18 }
-
Let obj = new Object({‘name’:’abc’})
-
Console.log({‘name’:’abc’,’age’:18})
-
Object.Keys(obj)可以得到obj的所有key
-
如果想用变量的值为属性名
a=‘xxx’
Let obj={[a]:yyy}
↓
xxx:yyy
-
Js每个对象都有一个隐藏属性,这个隐藏属性存储着其公有属性组成的对象的地址
-
存有所有隐藏(公有)属性组成的对象叫做原型,隐藏属性储存着原型的地址
-
共有属性用于节省内存
-
除了字符串,symbol也能作为属性名,迭代会用到
Let a = Symbol()
Let obj = {[a]: ‘Hello’}
2.如何删除对象的属性
- Var obj ={name:’abc’ }
- Delete obj.name 或 delete obj[‘name’] 值和属性名都删除
- Undefined只删除值
- 检查该属性是否还存在
- ‘name’ in obj === false 则不存在
- 含有属性名,但是值为 undefined
- 'xxx' in obj && obj.xxx === undefined
- 注意 obj.xxx === undefined 不能断定 'xxx' 是否为 obj 的属性
3.如何查看对象的属性
- 两种方法查看属性
- 中括号语法:obj['key']
- 点语法:obj.key
查看x所有属性名
- Object.keys(x)
- [‘属性名’]
查看x所有属性值
- Object.values(x)
- [‘属性值’]
查看所有属性名和属性名
- x
- {‘属性名’:‘属性值’}
- Object.entries(x)
- [Array(2)]
- [‘属性名’,‘属性值’]
查看x的所有属性和隐藏属性
- Console.dir(x)
判断一个属性是自身的还是共有的
- obj.hasOwnProperty('toString')
4.如何修改或增加对象的属性
直接赋值
obj['name'] = abc
批量赋值
Object.assign(obj, {age: 18, gender: 'man'})
改共有属性
obj.__proto__['toString'] = 'xxx'
改共有属性
Object.prototype['toString'] = 'xxx'
改原型
obj.__proto__ = common
let obj = Object.create(common)
注:所有 proto 代码都是强烈不推荐写的
5.'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj 判断name属性是否存在
obj.hasOwnProperty('name') //判断name属性是否是自身就有的