# JS对象基本语法

# 1.声明对象

  • 定义:无序的数据集合、键值对的集合
  • 写法
var obj = new Object({key:value})
let obj = {key1:value1,key2:value2}

  • 属性名:每个key都是对象的属性名(property)
  • 属性值:每个value都是对象的属性值

# 特殊的属性名

  • 所有属性名会自动把变成字符串

  • Object.keys(obj) 查看obj的所有key

# 变量作属性名

不加 []的属性名会自动变成字符串 加了[]则会当作变量求值

let p1 = 'name'
let obj = {p1:'fanison'}
let obj = {[p1]:'fanison'}

# 对象的隐藏属性

js中每个对象都有隐藏属性 隐藏属性存储着原型的地址

# 2.删除属性

delete obj.xxx
delete obj['xxx']

通过使用'xxx' in obj 查看obj是否含有xxx属性,发现obj.xxx = undefined 不能删除属性,只是将属性值xxx设置为undefined

注意:obj.xxx === undefined不能断定‘xxx’为obj的属性; 通过'xxx' in obj 查看obj是否含有xxx属性

# 3.查看属性

  • 查看自身所有属性 Object.keys(obj)
  • 查看自身+共有属性 console.dir(obj)
  • 查看属性 obj['key'] or obj.key

console.log('name')的返回值是 undefined, obj[console.log('name')]相当于obj["undefined"]

obj.name等价于 obj['name'] obj.name不等于obj[name]

obj.name   //此处name是字符串
obj[name]  //此处name是变量

# 4.修改属性

  • 直接赋值 obj['key'] = value or obj.key = valuevalue
  • 批量赋值 Object.assign(obj,{key:value,key:value})

  • 修改或增加共有属性

无法通过自身修改或增加共有属性 修改或增加原型上属性会引发问题

  • 修改隐藏属性

使用 __proto__ 不推荐 使用Object.create 推荐

不推荐

推荐

# 'name' in objobj.hasOwnProperty('name')的区别:

  • hasOwnProperty会忽略掉那些从原型链上继承到的属性
  • in不会忽略掉那些从原型链上继承到的属性