JS对象

173 阅读2分钟

对象定义

  • 无序的数据集合(可以打乱顺序)
  • 键值对集合{'name'(属性名)和'william'(属性值)是一对,'age'(属性名)和'18'(属性值)是一对}

写法

let obj = {'name': 'william', 'age': 18} // 简单写法

let obj = new Object({'name': william})  // 正规写法

console.log({'name': william', 'age': 18})

细节

  1. 键名(key)是字符串,不是标识符,可以包含任意字符
  2. 引号可省略
  3. 就算引号省略了,键名也还是字符串(重要)
  4. Object.keys(obj)可以得到obj的所有key,所有属性名会自动变成字符串
let obj = {
        1: "a",
        3.2: "b",
        1e2: true,
        1e-2: true,
        0.234: true,
        0xff: true,
      };
Object.keys(obj); => ["1","100","255","3.2","0.01","0.234"]

变量作属性名

let p1 = "name";
let obj = {p1 : 'william'} 这样写,属性名为'p1'
let obj = {[p1] : 'william'} 这样写,属性名为'name'

1.不加[]的属性名会自动变成字符串
2.加了[]则会当做变量求值
3.值如果不是字符串,则会自动变成字符串

对象的增删改查

删除obj的xxx属性

let obj = {'name': 'william', 'age': 18}

delete obj.name // 删除obj的name属性

obj

{age: 18} // name的槽也删了

// 或者,下面这种,两种一样的效果

let obj = {'name': 'william', 'age': 18}

delete obj['name'] // 删除obj的name属性

{age: 18} // name的槽也删了

(删除obj的xxx属性)obj.name = undefined

let obj = {'name': 'william', 'age': 18}

obj.name = undefined // 删除obj的name属性

obj

{name: undefined, age: 18} // name 的槽还在

检验对象不含属性名

'xxx' in obj === false  

含有属性名,但是值为undefined

'xxx' in obj && obj.xxx === undefined

注意obj.xxx === undefined不能断定'xxx'是否为obj的属性


1.查看自身所有属性

Object.keys(obj)

2.查看自身所有值

Object.values(obj)

3.查看自身属性和值

obj或者Object.entries(obj)

4.查看自身+共有属性

console.dir(obj)

5.判断一个属性是否是自身属性还是共有属性

let obj = {
    'name' : 'william',
    'age' : 18
}
obj.hasOwnProperty('name') // ''里的为属性,true为自身属性,false为共有属性

4.instanceof 判断一个实例是否属于某种类型

let obj = {};
obj instanceof Object; // 判断obj是否属于对象

修改或增加属性(写属性)

直接赋值

let obj = {name: 'william'} // name 是字符串
obj.name = 'william' // name 是字符串
obj['name'] = 'william'

注意:obj[name] = 'william' // 错误,因为name是变量,不确定

obj['na'+'me'] = 'william'
let key = 'name'; obj [key] = 'william'

注意:let key = 'name'; obj.key = 'william' // 错误,obj.key等价于obj['key']

批量赋值

Object.assign(赋值的对象,赋值内容[对象形式写出])

let obj = {}
Object.assign(obj,{p1:1,p2:2,p3:3}) // 注意obj后面的逗号

修改隐藏属性

不推荐使用__proto__

let obj = {name: 'william}
let obj2 = {name: 'jack'}
let common = {kind: 'human'}
obj.__proto__ = common
obj2.__proto__= common

推荐使用Object.create

let obj = Object.create(common)
obj.name = 'william'
let obj2 = Object.create(common)
obj2.name = 'jack'