对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
声明对象的两种语法
-
写法
可以通过以下三种方式声明:
let obj = { 'name': 'frank', 'age': 18 }
let obj = new Object({'name': 'frank'}) 正规的写法
console.log({ 'name': 'frank, 'age': 18 })
-
要点
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略(还是字符串(重要)),省略之后就只能写标识符
如何删除对象的属性
delete命令用于删除对象的属性,删除成功后返回true。
-
写法
delete obj.xxx 或 delete obj['xxx']
-
要点
- 'xxx' in obj === false 表示不含属性名
- 'xxx' in obj && obj.xxx === undefined 表示含有属性名,但是值为 undefined
- 注意 obj.xxx === undefined 不能断定 'xxx' 是否为 obj 的属性
如何查看对象的属性
查看一个对象本身的所有属性,可以使用Object.keys方法
-
写法
- 查看所有属性 Object.keys(obj)
- 查看自身+共有属性
console.dir(obj)或者自己依次用 Object.keys 打印出 obj._ proto_ - 判断一个属性是自身还是共有 obj.hasOwnProperty('toString')
- 查看单个属性
- 两种方法查看属性
- 中括号语法:obj['key'] --优先使用中括号语法
- 点语法:obj.key --点语法会误导你,让你以为 key 不是字符串
如何修改或增加对象的属性
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
-
写法
- 直接赋值
let obj = {name: 'frank'} // name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank'
obj[name] = 'frank' // 错,因 name 值不确定
obj['na'+'me'] = 'frank'
let key = 'name'; obj[key] = 'frank'
let key = 'name'; obj.key = 'frank' // 错
因为 obj.key 等价于 obj['key']
- 批量赋值
Object.assign(obj, {age: 18, gender: 'man'})
-
要点
- 无法通过自身修改或增加共有属性
let obj = {}, obj2 = {} // 共有 toString
obj.toString = 'xxx' 只会在改 obj 自身属性
obj2.toString 还是在原型上
- 我偏要修改或增加原型上的属性
Object.prototype.toString = 'xxx'
一般来说,不要修改原型,会引起很多问题
补充:修改或增加原型的共有属性
-
不推荐使用 proto
let obj2 = {name: 'jack'} let common = {kind: 'human'} obj.__proto__ = common obj2.__proto__ = common -
推荐使用 Object.create
obj.name = 'frank' let obj2 = Object.create(common) obj2.name = 'jack'
要改就一开始就改,不要后来再改
'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj是判断name是否是obj对象里所有属性中的一个,而obj.hasOwnProperty('name')是判断name是否是obj对象自身属性中的一个。
总结
对象的增删改查是JS重点,需在实践中所理解多操作。