JS 对象是无序的数据集合,是键值对的集合。
一、声明对象
声明对象的语法有两种。
- let/var 对象名 = {'键名':值 ,'键名':值}
- let/var 对象名 = new Object{'键名':值 ,'键名':值}
- 变量作属性名 —— [变量名] (中括号包住变量名)
- 除了字符串,symbol也能做属性名。
let obj = {'name':'bai',age:18}
let obj2 = new Object{'name':'bai'}
let obj3 = {1e2:true}
//Object.keys(obj3)——>100 科学计数法或十六进制等会求值后成为键名
键名是字符串,可以包含任何字符。键名的引号可以省略,但是引号省略后键名只能写标识符或者数字。(就算引号省略,键名也是字符串)
二、删除对象的属性
(以let obj = {'name':'bai',age:18}为例,以 xxx 指代属性名)
- delete obj.xxx 或者 delete obj['xxx'] —— 删除属性
- obj.xxx = undefined —— 只删除属性值
- 'xxx' in obj —— 返回false,则xxx不是obj的属性;返回true,则xxx是obj的属性。 obj.xxx === undefined 有可能是xxx属性的属性值是undefined,也可能是没有xxx属性。
三、查看对象的属性
1、查看所有的属性
(以let obj2 = {'name':'bai',age:18}为例,对象名为 obj2)
- Object.keys(obj2) —— 查看所有属性
- Object.values(obj2) —— 查看所有的属性值
- Object.entries(obj2) —— 查看所有的 key 和 value
- console.dir(obj2) —— 查看 自身+共有属性
obj2.__proto__—— 查看共有属性(不推荐)obj2.hasOwnProperty('xxx')—— 判断 xxx 属性是否是自身属性:返回true,则是obj2的自身属性;false 则不是其自身属性。例如obj2.hasOwnProperty('toString')返回false。
'name' in obj 和 obj.hasOwnProperty('name') 的区别?
'name' in obj —— 查看该属性(name)是否在此对象(obj)里,不区分是自身属性还是共有属性。
obj.hasOwnProperty('name')——查看该属性(name)是否为此对象(obj)的自身属性。
2、原型
JS 中每一个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址。这个共有属性组成的对象叫做原型。
每个对象都有原型,这个原型包含所有对象的共有属性,是对象的根。
对象的原型也是对象,所以对象的原型也有原型,是 null。
3、查看某属性
(以let obj2 = {'name':'bai',age:18}为例,对象名为 obj2)
- 中括号语法:
对象名['属性名']。例如obj2['name']。 - 点括号语法:
对象名.属性名。例如obj2.name
四、修改或增加对象的属性
1、赋值
- 直接赋值
- 批量赋值:
Object.assign(对象名,{'属性名':值})例如Object.assign(obj,{age:18,gender:'man'})
2、修改或增加共有属性
无法通过自身修改共有属性
例如
let obj={},obj2{}
obj.toString='xxx'
//只是在obj的自身属性上加上了 toString 属性,不是改变了原型
//obj2.toString 还是在原型上
修改或增加原型上的属性——修改了共有属性
方法有以下两种,以对象名 obj ,修改toString 属性为例
obj.__proto__.toString = 'xxx'//不推荐用__proto__Object.prototype.toString = 'xxx'一般来说,不要修改共有属性。
3、改原型
方法有两种
obj.__proto__ = common(不推荐__proto__)Object.create—— 在一开始就以某个对象为原型。 在开始创建时加上属性需要:Object.create(作为原型的对象名,{属性值:{value:值}}),也可以 直接赋值 或 批量赋值。
例如
__proto__方法:
let obj={name:'bai'}
let obj2 = {age:18}
let common = {kind:'human'}
obj.__proto__ = common
//保存了原型,但是在原有的原型链上增加了 common 的节点
//并且 obj2 的原型没有改变
Object.create方法:
let common = {kind:'human'}
let obj2 = Object.create(common,{age:{value:18}})