对象
定义:
无序的数据集合
键值对的集合
写法:
let obj = {'name': 'pjh'};
常用写法
let obj = new Object({'name': 'pjh'});
正规写法
console.log({'name': 'pjh'});
匿名对象,前面不写东西 JS 会当成一个 label
细节:
键名是字符串,不是标识符,可以包含任意字符
引号可以省略,省略之后就只能写标识符
==就算引号省略了,键名也还是字符串==
所有的属性名会自动变成字符串,所以会存在一些奇怪的属性名
Object.keys(obj)
得到 obj 的所有 key
变量作属性名
let a = 'name'
let obj = {[a]: 'pjh'}
不加 [] 的属性名会自动变成字符串
加了 [] 则会当作变量求值
值如果不是字符串,会尝试把它变成字符串
var obj = {
[1+2+3]: '六'
}
除了字符串,symbol 也能做属性名
let a = Symbol()
let obj = {[a]: 'hello'}
对象的隐藏属性
JS 中的每一个对象都有一个隐藏属性
这个隐藏属性存储着其==公有属性组成的对象==的地址
这个==公有属性组成的对象==叫做原型
就是说,隐藏属性存储着原型的地址
删属性
delete obj.xxx
或delete obj['xxx']
即可删除 obj 的 xxx 属性
'xxx' in obj === true
判断属性名是否存在
'xxx' in obj && obj.xxx === undefined
含有属性名但是值为 undefined
==注意:== obj.xxx === undefined
不能断定 'xxx' 是否为 obj 的属性
读属性
查看自身所有属性:Object.keys(obj)
查看自身+共有属性console.dir(obj)
查看自身属性+值Object.entries(obj)
判断一个属性是自身的还是共有的obj.hasOwnProperty
'name' in obj
是判断 obj 是否有该属性,不区分自身有还是原型有hasOwnproperty('name')
是判断自身是否有该属性
中括号语法:obj['key']
点语法:obj.key
变量:obj[key]
原型
每个对象都有原型,原型里面存着对象的共有属性
对象的原型也是对象,这个原型包含所有对象的共有属性,是==对象的根==
这个原型也有原型,是 null
写属性
直接赋值
批量赋值:Object.assign(obj,{age: 18, gender: 'man'})
let obj = {},obj2 = {}
obj.toString = 'xxx'
无法通过自身修改或增加共有属性
obj.__proto__.toString = 'xxx' //不推荐使用__proto__
Object.prototype.toString = 'xxx'
修改共有属性
let common = {'国籍': '中国'}
let person = Object.create(common)
修改原型