提要:
- 声明对象
- 删除对象的属性
- 查看对象的属性
- 修改或增加对象的属性
一. 声明对象
对象是键值对的集合。
1. 语法
包含属性名(键名)和属性值(键值)。
1)正规写法:let obj = new Object ({'name':'LLLLxto','age':9})
2)简便写法:let obj = {'name':'LLLLxto','age':9}
3)另外还可以:console.log ({'name':'LLLLxto','age':9})
2. 关于属性名
1)属性名是字符串,不是其他类型,可以包含任意字符。如:
let obj={
'':'a'
1:'b'
2.3:'c'
.456:'d'
1e-2:true
0xFF:true
}
注意:ES6中,symbol类型也能作属性名。
2)键名引号可以省略(不含特殊字符时)。
3)就算不加引号,键名也还是字符串。
4)用变量的值作属性名,用中括号 [] 括起来。如:
let a='xxx'
let obj={
[a]:123
}
obj //返回{xxx:123}
小结:不加 [] 的属性名,会自动变成字符串;加了 [] 的属性名会被当作变量,先求其值,再变成字符串。
二. 删除对象的属性
1. 语法:
1)删除属性名:delete obj.name
或delete obj['name']
2)仅删除属性值:obj.name = undefined
2. 验证
1)是否删除成功:'name' in obj
,返回 false 说明属性已不存在
2)属性存在但值是否为空:'name' in obj && obj.name === undefined
注:不能只写obj.name === undefined
来判定,因为不能断定'name'为obj的属性名。如:
let obj={
name:undefined
}
let obj2={}
obj.name === undefined //返回true
obj2.name === undefined //也返回true,但事实上,'name'不是obj2的属性名
三. 查看对象的属性
1. 查看所有属性
1)查看所有自身属性名:Object.keys(obj)
2)查看所有自身属性值:Object.values(obj)
3)查看所有自身属性名和属性值:Object.entries(obj)
4)查看所有自身属性和共有属性(以目录形式):console.dir(obj)
5)如何判断自身属性/共有属性:obj.hasOwnProperty('name')
,返回 true 说明是自身属性。
hasOwnProperty 只能判断是否为自身属性,可结合 in 操作符判断是否为继承属性(共有属性)。
对比:'name' in obj
不区分自身属性和共有属性
2. 查看个别属性
1)obj['name']
2)obj.name
- 两种方式等价,注意name是字符串。
- 错误方式:
obj[name]
,此时name是变量,并不确定变量的值。
四. 修改或增加对象的属性
修改/增加,语法基本相同,已有则改,没有则增。
1. 修改或增加自身属性
1)直接赋值
① let obj = {name:'LLLLxto'}
② obj.name = 'LLLLxto'
③ obj['name'] = 'LLLLxto'
错误方式:obj[name] = 'LLLLxto'
④
let key = 'name'
obj[key] = 'LLLLxto'
错误方式:
let key = 'name'
obj.key = 'LLLLxto'
关键在于理解属性名是字符串,以及变量作属性名要加 [] ,并先对 [] 内求值,再变为字符串。
2)批量赋值
Object.assign(obj,{name:'LLLLxto',age:9})
2. 修改或增加共有属性 (不推荐这样做)
JS设置,无法通过自身修改或增加共有属性。如果一定要修改或增加原型的属性(即共有属性),则:
1)修改或增加原型属性
① obj.__proto__.toString = 'xxx'
(用__proto__表示共有属性的方式均不推荐)
② window.Object.prototype.toString = 'xxx'
2)修改或增加原型(本质为修改或增加对象)
① obj.__proto__ = 'xxx'
(用__proto__表示共有属性的方式均不推荐)
② 增加原型,形成原型链
let common = {age:9}
let obj = Object.create(common)
obj.name = 'LLLLxto'
推荐此方式,这意味着,若要改原型一开始就要改,不要后来再改。
注意:创建对象、添加属性两句可合写为
let obj = Object.create(common,{
name:{value:'LLLLxto'}
})
而不是
let obj = Object.create(common,{
name:'LLLLxto'}
) //报错
也不是
let obj = Object.create({name:'LLLLxto'}) //属性name增加在了原型里,而不是obj的自身属性