对象 object
js中唯一一种复杂类型
- 无序的数据集合
- 键值对的集合
声明方式
let obj = {'name':'Tom','age':18}
let obj = new Object({'name':'Tom'})
注意:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
- 就算省略了引号,键名还是字符串
属性名
所有的属性名会自动变成字符串
Object.keys(obj) //可以得到 obj 的所有的 key
变量做属性名
let p1 = 'name'
let obj = {
[p1]: 'Tom'
}
这样写的话, obj 的属性名为 'name'
细节:
- 不加
[]的属性名会自动变为字符串 - 加了
[]的属性名会被当做变量求值
隐藏属性
JS中每一个对象都有一个隐藏属性__proto__,这个属性存储着其共有属性组成的对象的地址,这个共有属性组成的对象叫做原型,也就是说,隐藏属性__proto__中存储着原型的地址
原型
-
每个对象都有原型
原型里存着对象的共有属性,比如obj的原型就是一个对象,obj.__proto__存着这个对象的地址,这个对象里面有
toString / constructor / valueOf等属性 -
对象的原型也是对象
对象的原型也有对象,obj={}的原型即为所有对象的原型,这个原型包括对象的共有属性,是对象的根,这个原型也有原型,为
null,是一个比较特殊的原型
删除属性
delete obj.xxx
delete obj['xxx']
上面的代码都可以删除对象 obj 中的 xxx 属性
查看所有属性
Object.keys(obj) //查看自身所有属性
console.dir(obj) //查看自身+共有属性
obj.hasOwnProperty('toString') //判读一个属性是自身还是共有的
查看单个属性
obj['key'] //中括号语法
obj.key //点语法
注意:点语法会误导新人,认为 key 不是字符串,实际上 key 是一个字符串
obj.name === obj['name']
obj.name !== obj[name]
修改或增加属性
修改或增加自身属性
let obj = { name:'Tom' }
obj.name = 'Tom'
obj['name'] = 'Tom'
obj['na' + 'me'] = 'Tom'
let key = 'name'; obj[key] = 'Tom'
可以用下面的代码进行批量赋值
Object.assign(obj,{age:18,gender: 'man'})