JS 对象基本用法

151 阅读2分钟

声明对象的两种语法

  1. 第一种形式
let person = { 'name': 'LuccaJ', 'age' : 18 }
  1. 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

查看是否删除成功

  1. 不含属性名
'name' in person
  1. 含有属性名, 但是值为 undefined
'name' in person && person['name'] === undefined
  1. 注意:
person['name'] === undefined

这句代码, 不能断定 'name' 是否为person的属性

有两种可能

  1. name 是 person 的属性, 可是 name 的值为空
  2. 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 可以用来区分是自身的, 还是共有的