javascript对象也有属性来定义它的特征。也可以用无序的数据集合或键值对的集合来定义javascript对象。
声明对象的两种写法
- let obj = { 'name': 'frank', 'age': 18 }或者let obj =new Object ({'name': 'frank', 'age': 18 })
- console.log({'name':'frank','age':18})
- 上面name、age代表属性名也就是键,frank、18代表属性值也就是值。
- 键名是字符串,不是标识符,可以包括任意字符。
- 引号可以省略,省略之后只能写标识符。
- 就算引号省略了,键名也还是字符串。
删除对象的属性
- delete obj.xxx或delete obj['xxx']
即可删除obj的xxx属性
- 'xxx' in obj ===false
说明obj里面没有xxx属性
- 'xxx' in obj &&obj.xxx===undefined
说明obj里面有xxx属性,但是没有定义
- 注意obj.xxx===undefined时,不能断定obj是否含有xxx属性
var obj={}
var obj2={xxx:undefined}
我们可以看到obj2含有xxx属性但是还是返回undefined,所以当返回值返回undefined时无法判断是否含有该属性。此时我们应该用'xxx' in obj看他的返回值是ture还是false。
查看对象的属性
- 查看所有属性
- 查看自身所有属性
Object.keys(obj)
2.查看自身+共有属性
console.dir(obj)/Object.key打印出obj.__proto__
3.判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
如果不是自身的就返回false,是自身的返回ture。
- 查看属性
- 两种方法查看属性
- 中括号语法
obj['key']
- 点语法
obj.key
两种语法建议使用中括号语法(针对新手),点语法会误导你以为key不是字符串。
修改或增加对象的属性
- 直接赋值
let obj = {name: 'frank'}
obj.name = 'frank'
obj['na'+'me'] = 'frank'
let key = 'name'
obj[key] = 'frank'
let key = 'name'; - 批量赋值
Object.assign(obj,{age:18;gender:'man'})
- 修改或增加共有属性
1.无法通过自身修改或增加共有属性
let obj={}
let obj2{}
obj.toString='xxx'2.强行修改或增加原型上的属性
obj.__proto__.toString='xxx'
Object.prototype.toString='xxx'一般来说不要修改原型,会引起很多问题。
'name' in obj和obj.hasOwnProperty('name') 的区别
共同点是两种查看属性是不是在对象里的方法
前者自身属性和共有属性都返回true,后者仅仅是自身属性才返回true
属性读取.与[]的区别
js在属性读取的时候可以用到.语法和[ ]语法,但是[ ]语法可以取代.语法,而.语法却不能取代功能更强大的[ ]语法,在下列情况下就只能用[ ]语法了:
- 可以用变量作为属性名或访问,而点方法不可以
let obj={} obj.name = 'leehome' let attr ='name' obj.attr //undefined obj[attr] //leehome - []中括号法--可以用数字作为属性名,而点语法不可以
let obj = {1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六',7:'周日'} console.log(obj[1]) // 周一 - [ ] 可以动态访问的属性名,可以在程序运行时创建和修改属性,点操作符就不行
const obj={}; const message=['leehome','handsome','man']; for(i=0;i<3;i++){ obj['attr'+i]=message[i]; } console.log(obj); //{attr0: "leehome", attr1: "handsome", attr2: "man"} - 如果属性名中包含会导致语法错误的字符,或者属性名是关键字或者保留字,也可以使用方括号表示法。
const obj ={'first name':'liu','last name':'chuanfeng' ,if:'test'}
console.log(obj['first name'])
//liu
console.log(obj.first name)
//语法错误
详细可查询:使用对象MDN