声明对象的两种语法
- 第一种形式
let person = { 'name': 'LuccaJ', 'age' : 18 }
- new Object()形式
let person = new Object({ 'name': 'LuccaJ'})
删: 如何删除对象的属性
删:
删属性名和属性值
let person = { 'name': 'LuccaJ', 'age' : 18 }
delete person['name']
仅仅删除属性值
let person = { 'name': 'LuccaJ', 'age' : 18 }
person['name'] = undefined
查看是否删除成功
- 不含属性名
'name' in person
- 含有属性名, 但是值为 undefined
'name' in person && person['name'] === undefined
- 注意:
person['name'] === undefined
这句代码, 不能断定 'name' 是否为person的属性
有两种可能
- name 是 person 的属性, 可是 name 的值为空
- name 不是 person 的属性, 那么 name 的值也是空
代码栗子: 一个反栗子
var obj = {}
var obj2 = {x: undefined}
obj.x === undefined
true
obj2.x === undefined
true
查: 如何查看对象的属性
查:
// 查看自身所有属性名, key
Object.keys(person)
// 查看自身所有属性值, value
Object.values(person)
// 查看自身所有 key 和 value
Object.entries(person)
// 查看自身属性 + 共有属性, 以目录的形式打印出来
console.dir(person)
// 判断一个属性是自身的还是共有的
person.hasOwnProperty('name')
增: 如何修改或增加对象的属性
使用点语法直接增加和修改对象的属性
let person = { 'name': 'LuccaJ'}
person.name = 'new name'
// 或者
person['name'] = 'new name'
// 批量赋值
Object.assign(person, {age: 18, gender: 'man'}
扩展:
可以修改或者增加共有属性么?
let obj = {}, obj2 = {}
obj.toString = 'xxx'
// 思考: 修改了 obj 的 toString, 那么 obj2 的 toString 会被修改么?
JS 对于此类情况做了特殊的设计, 只有读取的时候可以读到对象的原型, 写入的时候是不可以的, 所以上面只修改了 obj 的 toString, 对于其他的对象没有影响
如果非要修改原型, 可以使用
Object.prototype.toString = 'xxx'
不过, 没事儿不要这样做, 不要修改原型, 会引起很多问题
修改隐藏属性
不推荐使用 __proto__
推荐使用 Object.create
let common = {kind: 'human'}
let person = Object.create(common)
person.name = 'LuccaJ'
规范大概的意思是, 要改就一开始就改, 别后来再改
'name' in obj和obj.hasOwnProperty('name') 的区别
区别:
in
let person = { 'name': 'LuccaJ', 'age' : 18 }
'toString' in person
true
'name' in person
true
person.hasOwnProperty('toString')
false
person.hasOwnProperty('name')
true
小结:
in 不会区分自身属性还是共有属性
hasOwnProperty 可以用来区分是自身的, 还是共有的