对象
object
定义
- 无序的数据集合
- 键值对的集合
写法
let obj = { 'name': 'frank', 'age': 18 }
let obj = new Object({'name': 'frank'})
- 键值
'name'
为键'frank'
为值'age'
为键'18'
为值
- 键名是字符串,不是标识符,可以包含任意字符
- 就算引号省略了,键名也还是字符串(重要)
属性名和属性值
- 属性名:每个
key
都是对象的属性名(property)
- 所有属性名会自动变成字符串
Object.keys(obj)
可以得到obj
的所有key
- 变量属性名
let p1 = 'name' let obj = { p1 : 'frank'} 这样写,属性名为 'p1' let obj = { [p1] : 'frank' } 这样写,属性名为 'name'
- 不加
[ ]
的属性名会自动变成字符串 - 加了
[ ]
则会当做变量求值
- 不加
- 属性值:每个
value
都是对象的属性值 * 值如果不是字符串,则会自动变成字符串
对象的隐藏属性(重点回顾原型那一章)
- 隐藏属性
- JS 中每一个对象都有一个隐藏属性
- 这个隐藏属性储存着其共有属性组成的对象的地址
- 这个共有属性组成的对象叫做原型
- 也就是说,隐藏属性储存着原型的地址
代码
var obj = {} obj.toString() // obj为空对象,就从obj的隐藏属性存的共有地址里面找
对象的增删改查
删除属性
删除
obj
的xxx
属性
delete obj.xxx 或 delete obj['xxx']
delete obj.xxx
不仅删除属性名,还删除属性值obj.xxx = undefined
仅仅只是删除了属性值,或者说是替换了属性值- 两者不同
查看属性

- 查看自身所有属性
Object.keys(obj)
obj.__proto__
他显示的Array
- 查看自身+共有属性
- `console.dir(obj)
obj.__proto__
他显示的是Oject
- 注意区分两者的区别
- 判断一个属性是自身的还是共有的(
true
和false
)obj.hasOwnProperty('toString')
- 对象的根
- 每个对象都有原型
- 对象的原型也是对象
- 对象的原型也有原型,这个原型包含所有对象的共有属性,是对象的根
- 这个原型也有原型,是
null
- 两种方法查看属性
obj['key']
查看字符串obj[key]
查看变量obj.key
查看属性- 变量和常量要区分好
区分变量与字符串(重点记住)
obj.name 等价于 obj['name']
obj.name 不等价于 obj[name]
或者说
let name = 'frank'
obj[name]等价于obj['frank']
[name]
是变量,里面可以是任何数['name']
或['frank']
是字符串,里面是固定的- 两者有重大区别
增加属性和修改属性
- 直接赋值 let obj = {name: 'frank'} // name 是字符串
- 批量赋值 Object.assign(obj, {age: 18, gender: 'man'})
- 修改或增加共有属性
- 强烈要求使用
Object.create
,直接在创建之初就把要有的共有属性直接写进去 - 一开始就修改好共有属性
let common = {kind: 'human'} let obj = Object.create(common) obj.name = 'frank' let obj2 = Object.create(common) obj2.name = 'jack'
- 强烈要求使用
区分var
和let
,const
var
- 其作用域为该语句所在的函数内
- 存在变量提升
- 允许重复声明
let
和const
- 其作用域为该语句所在的代码块内
- 不存在变量提升
- 不允许重复声明
- 注意:
const
为常量,声明声明后不能修改,但是里面的属性可以替换,但不能超过创建时的长度
- 注意:
'name' in obj
和obj.hasOwnProperty('name')
的区别

'name' in obj
- 只能看他是否是对象的属性,但是无法区分这个属性是不是共有属性,只要是对象的属性都是正确的
obj.hasOwnProperty('toString')
- 他专门用来区分这个属性是不是这个对象的共有属性