声明对象的几种语法
对象是无序的数据集合或键值对的集合;声明对象和多种方式,常见的方式有以下:
1、let obj = {'name':'xxx','age':18}
2、console.log({'name':'xxx','age':18})
注意细节:
- 键名是字符串,不是标识符,可以包住任意字符。
- 引号是可以省略的,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串
变量作属性名
let p1 = 'name'
let obj = {p1:'xxx'}//这样写属性名为'p1'
let obj = {[p1]:'xxx'}//这样写属性名为'name'
对比:
- 不加[]的属性名会自动变成字符串
- 加了[]则会当做变量求职
- 值如果不是字符串则会自动变成字符串
对象的隐藏属性
1、js中每一个对象都会有一个隐藏属性
2、这个隐藏属性储存着其共有属性著称的对象的地址
3、这个共有属性组成的对象叫做原型
4、也就是说,隐藏属性储存着原型的地址
代码示例
var obj ={}
obj toString()//这样js不会报错
因为obj的隐藏属性对应的对象上有toString()
增删改查/删除
delete obj.name 或 delete obj['name']
即可删除obj的xxx属性
查询是否删除:'xxx' in obj === false // 正常没有删除是会返回true
增删改查/查属性
Object.key(obj) //查看所有属性
console.dir(obj) //查看共有属性
obj.hasOwnProperty(‘toString’) //判断一个属性是自身还是共有的
1、原型:每个对象都有原型,原型里存着对象的共有属性,比如obj的原型就是一个对象,obj__proto__存着这个对象的地址,这个对象理由toString/constryctor/valueof等属性
2、对象的原型也是对象,obj={}的原型即为所有对象的原型,这个原型包含所有对象的共有属性,是对象的根,这个原型也有原型,是null
修改和增加对象属性
修改对象的属性可以直接赋值和批量赋值。
let obj = {name:'xiaoming'}
obj.name = 'xiaoming'
obj['name'] = 'xiaoming'
obj['na' + 'me'] = 'xiaoming'
let key = 'name';obj[key] = 'xiaoming'
//批量赋值
Object.assign(obj,{age:18, gender:'man'})
由于每个对象都有共有属性,无法通过自身修改或增加共有属性
let obj = {},obj2 ={}
obj.toString = "XXXX"
//obj2.toString依然在原型上,因为上面的只修改了obj的自身属性。
//如果确实想要修改原型上的属性
obj.__proto.toString = 'xxx' //这个不推荐
Object.prototype.toString = 'xxx' //一般不建议修改原型
复制代码
增加对象属性的方法和修改自身属性的方法一样,已经有的属性修改,没有就增加属性。
'name' in obj和obj.hasOwnProperty('name') 的区别
两者的区别在于,前一个判断 obj 对象是否有这个属性,不论这个属性是私有还是共有属性;后者则是判断这个属性是否为私有属性。
let obj06 = {
'name':'xiaoming',
'age':18
};
'name' in obj06 //返回true
'toString' in obj06 //返回的也是true
obj06.hasOwnProperty('name') //返回的true
obj06.hasOwnProperty('toString') //返回的flase