对象 object
定义
- 无序的数据集合
- 键值对的集合
写法
let obj = { 'name': 'Li', 'age': 18 }
let obj = new Object({ 'name': 'Li'})
细节
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串(重要)
属性名和属性值
- 每个key都是对象的属性名(property)
- 每个value都是对象的属性值
属性名自动会变成字符串的情况
let obj = {
1: 'a',
3.2: 'b',
le2: true,
le-2: true,
.234: true,
OxFF: true
}
打出的结果是
Object.keys(obj) => ["1","3.2", "0.01","100","0.234","255"]
细节
Object.keys(obj)可以得到 obj 的所有 key
变量作属性名
如何用变量做属性名 ,之前都是用常量做属性名
- let p1 ='name'
- let obj = {p1:'frank'}这样写,属性名为'p1'
- let obj = { [p1]:'frank'}这样写,属性名为'name'
- 对比 ,不加[]的属性名会自动变成字符串 ,加了 []则会当做变量求值 ,值如果不是字符串,则会自动变成字符串
对象的隐藏属性
- JS中每一个对象都有一个隐藏属性
- 这个隐藏属性储存着其共有属性组成的对象的地址
- 这个共有属性组成的对象叫做原型 ,也就是说,隐藏属性储存着原型的地址
代码示例
- varobj = {}
- obj.toString() 居然不报错 ,因为obj的隐藏属性对应的对象上有toString()
删除属性
- delete http://obj.xxx或 delete obj[ xxx ] 即可删除 obj 的 xxx属性
- 请区分「属性值为undefined」和「不含属性名」
- 不含属性名 'xxx' in obj === false
- 含有属性名,但是值为undefined : 'xxx' in obj && http://obj.xxx === undefined
- 注意 http://obj.xxx === undefined ,不能断定‘xxx’是否为obj的属性
查看所有属性(读属性)
- 查看自身所有属性 Object.keys (obj)
- 查看所有的值 Object.values (obj)
- 查看所有的键跟值 Object.entries (obj)
- 查看自身+共有属性 console.dir(obj)
- 判断一个属性是自身的还是共有的 obj.hasOwnProperty('toString')
查看属性
两种方法查看属性
- 中括号语法: obj['key']
- 点语法: obj.key
- 坑新人语法:obj[key] 变量key值一般不为'key'
修改或增加属性(写属性)
- 直接赋值 let obj = {name: 'frank'} //name是字符串
- obj.name = 'frank' //name 是字符串
- obj['name'] = 'frank'
- obj ['na' + 'me'] = 'frank'
- let key = 'name'; obj[key] = 'frank'
- let key = 'name';
- 批量赋值 Object.assign(obj, {age: 18, gender: 'man'})
修改或增加共有属性
无法通过自身修改或增加共有属性
- let obj = {}, obj2 = {} // 共有 toString属性
- obj.toString = 'xxx' 只会在改 obj 自身属性
- obj2.toString 还是在原型上
修改或增加原型上的属性
- obj._proto_.toString = 'xxx' // 不推荐用 _proto_
- Object.prototype.toString= 'xxx'
一般来说,不要修改原型,会引起很多问题
修改隐藏属性
- let obj = {name:'frank'}
- let obj2 = {name: 'jack'}
- let common = (kind: 'human'}
- obj.__proto__ = common
- obj2.__proto__ = common
但是不推荐使用__proto__
推荐使用 Object.create
- let obj = Object.create(common)
- obj.name = 'frank'
- let obj2 = Object.create(common)
- obj2.name = 'jack'
规范大概的意思是,要改就一开始就改,别后来再改
小提问:'name' in obj和obj.hasOwnProperty('name')的区别
- 'name' in obj 不会区分‘name’是自身的属性还是共有的属性
- obj.hasOwnProperty('name')可以查看‘name’是否为自身属性
本文资料来源:饥人谷