对象的定义
无序的数据集合,键值对的集合
声明对象:
let obj = {'name':'frank','age':18}
let obj = new Object({'name':'frank'})
console.log({'name':'frank','age':18})
一些细节:
键名是字符串,不是标识符,可以包含任何字符
引号可以省略,省略后只能写标识符
就算引号省略,键名也还是字符串
如何用变量做属性名
let p1 = 'name'
let obj = {[p1]:'frank'}
这样写,属性名为'name',不加[]的属性名会自动变成字符串,加了会当成变量求值,值如果不是字符串,自动转成字符串
对象的隐藏属性和原型
JS中每一个对象都有一个隐藏属性,这个隐藏属性存储这其共有属性组成的对象的地址,这个共有属性组成的对象叫原型,也就是说,隐藏属性存着原型的地址
每个对象都有原型,原型里存着对象的共有属性,对象的原型也是对象,所以对象的原型也有原型
obj={}的原型即为所有对象的原型,这个原型包含所有对象的共有属性,是对象的根,这个原型也有原型,是null
对象的增删改查
删除对象属性
delete obj.xxx
delete obj['xxx']
注意区分属性值为undefined和不含属性名
不含属性名:'xxx' in obj === false
含有属性名,但是值为undefined:'xxx'in obj && obj.xxx === undefined
查看属性
Object.keys(obj)
查看自身+共有属性
console.dir(obj)或者用Object.keys打印出obj.__proto__
判断一个属性是自身的还是共有的obj.hasownproperty('toString')
查看属性
中括号语法:obj['keys']
点语法:obj.key
修改或增加属性
直接赋值
let obj = {name : 'frank'}//name是字符串
obj.name = 'frank'//name是字符串
obj['name'] = 'frank'
let key = 'name';obj[key] = 'frank'
let key = 'name';obj.key = 'frank'//错误,obj.key等价于obj['key']
批量赋值
Object.assign(obj,{age:18,gender:'man'})
修改或增加共有属性
无法通过自身修改或添加共有属性,若要强行修改或添加原型上的属性
obj.__proto__.toString = 'xxx'//不推荐使用__proto__
Object.prototype.toString='xxx'
一般来说不要修改原型会引起很多问题,推荐使用Object.creat()
key in obj 和 obj.hasOwnProperty('toString')的区别
key in obj 不能判断出这个属性是自身属性还是共有属性
obj.hasOwnProperty('key') 可以判断出这个属性是自身属性还是共有属性