对象
定义
无序的数据集合、键值对的集合
写法
let obj = {
'name':'jack',
'age':18
}
let obj = new Object({
'name':'jeck'
})
注意:
- 键名是字符串
- 键名可以不写引号,默认也会变成字符串
- key被称为对象的属性名
- value被称为对象的属性名
- Object.keys(obj)可以获取到对象的所有key
变量值作为属性名
let a = 'name';
var obj = {
[a]:1111
}
冷知识
symbol也能做属性名
let a = Symbol()
let obj = {
[a]:'hello'
}
对象的增删改查
删除对象属性
delete obj.xxx
// 或者
delete obj['xxx']
// 注意要判断obj的xxx属性值为undefined和obj不含有xxx属性两种情况
// 是否含有属性名
'xxx' in obj === false //true不含有属性名,false含有属性名
// 含有属性名,属性名是否为undefined
'xxx' in obj && obj.xxx === undefined
// 注意不能使用obj.xxx === undefined判断xxx是否为obj属性,他只能判断obj的属性xxx的值是否为undefined
读取对象属性
// 查看自身所有属性
Object.keys(obj)
// 查看所有值
Object.values(obj)
// 查看key和value,key一个数组,value一个数组
Object.entries(obj)
// 查看自身+共有属性
console.dir(obj)
// 判断一个属性是自身的还是原型上的
obj.hasOwnProperty('toString')
// 查看有无该属性
'xxx' in obj
查看对象属性
// 中括号语法
obj['key']
// 点语法
obj.key
// 注意!!!
obj[name] // 获取到的不是属性名为name的值,而是属性名为name这个变量的值的属性值
修改或者增加属性
// 直接赋值
let obj = {name:'jack'}
obj.name = 'jack'
obj.['name'] = 'jack'
// 批量赋值
Object.assign(obj,{age:18,gender:'man'}) // ES6
修改或者增加原型属性
// 一般来说无法通过自身修改或者增加原型上的属性
// 使用实例对象身上隐藏属性__proto__进行增加
obj.__proto__.toString='xxx' //可以做到,但是不推荐这么做
// 使用构造函数进行增加属性和方法
Object.prototype.toString = 'xxx'
修改隐藏属性
obj.__proto__ = {name:'jack'} // 不推荐修改__proto__
// 推荐使用Object.create
let obj = Object.create({name:'jack',age:18}) // ES6
// 要改隐藏属性就在创建对象的时候改,不要在后来使用中改