对象
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')- 他专门用来区分这个属性是不是这个对象的共有属性

