声明对象的两种语法
- 在js中,对象时键值对集合,类似于其他语言中的map,属性实际上是是一个字符串定义的键,而不是成员变量
- 某些情况下,键的引号可以被省略
- 如果想要以字符串变量的值作为属性名,应该加中括号
var a = {};
var a = {'name': 'xyz', addr: 'shanghai'};
var a = new Object();
var a = new Object({'name': 'xyz'});
var b = a;
var key = 'name'
var a = {[key]: 'xyz'}; // 对象a有一个属性name,a.name = xyz
var key = 'sex'
var a = {[key]: 'male'}; // 对象a有一个属性sex,a.sex = male
如何删除对象的属性
以删除对象obj的属性name为例
delete obj.name
delete obj['name']
删除之后判断对象obj是否包含属性name?
'name' in obj
name in obj // 这是错误的!,这条语句时判断变量mame的值是否是对象obj的属性
如果一开始就以变量值作为属性名的呢?
var key = 'name';
var obj ={
[key]: 'flag的值'
}
[key] in obj // 值 true
key in obj // 值 true
delete obj[[key]]
[key] in obj // 值 false
如何查看对象的属性
以对象obj为例
var obj = {
name: 'dsxyz',
sex: 'male'
}
Object.keys(obj) // 查看对象obj的所有属性,结果['name', 'sex']
Object.values(obj) // 查看对象obj的所有值,结果['dsxyz', 'male']
Object.entries(obj) // 查看对象obj的所有属性和值,结果[['name', 'dsxyz'],['sex', 'male']]
obj.name // 对象obj的属性name,值为 dsxyz
obj['name'] // 对象obj的属性name,值为 dsxyz
obj[name] // 对象obj,以变量name值为属性名的属性,这里值是undifined
obj.hasOwnProperty("toString") // 属性toString是否是对象obj的私有属性,toString是原型属性,所以这里值是false
obj.hasOwnProperty("name") // 属性toString是否是对象obj的私有属性,name不是原型属性,所以这里值是true
如何修改或增加对象的属性
常用的修改方法
var obj = {
name: 'dsxyz',
sex: 'male'
}
obj.nmae = 'hello'
obj['name'] = 'moning'
obj[name] = 'moning' // 这是错误的!!!
两种批量的修改方法
var obj = {
name: 'dsxyz',
sex: 'male'
}
obj = {...obj, 'name':'kk','addr': 'shanghai'}
Object.assign(obj,{'name':'xyz','sex':'male'})
js很灵活,对象的任何属性,包括其原型,
var a = {}
var obj = Object(a); // 以对象a作为原型,创建对象obj,这种方法下,obj可以调用对象a的属性,以及对象a原型的属性,有点类似于强类型语言中的继承概念
obj.__proto__ = a ; // 对象obj创建后,以对象a作为其原型
甚至原型的属性,也可以修改(实际中不提倡)
var obj = { name: 'dsxyz', sex: 'male' }
obj.__proto__.toString = 'xxx';
Object.prototype.toString = 'kkk';
'name' in obj和obj.hasOwnProperty('name') 的区别
- 'name' in obj,是判断name是否是obj的属性,不区分是自身的属性还是原型属性
- obj.hasOwnProperty('name') 是判断name是否是obj自身的属性