对象的定义
- 无序的数据集合
- 键值对的集合 声明对象的两种写法
let obj={name:'ross',age:18}
let obj=new Object({'name':'ross','age':18})
注意:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略后就只能写标识符
- 引号省略后,键名还是字符串 我们可以通过Object.keys(obj)来查看键名的类型为字符串
每个key值也称为对象的属性名,每个value也称为对象的属性值。
变量如何做属性名
之前都是用常量做属性名
let p1='name'
let obj={p1:'ross'}//属性名为'p1'
let obj={[p1]:'ross'}//属性名为'name'
注意区别:
- 不加[]的属性名会自动变成字符串
- 加了[]则会当作变量求值
- 值不是字符串,则会自动变成字符串
对象的增删改查
删
语法:delete obj.xxx或delete obj['xxx']即可删除对象属性
let obj={
name:'jack',
age:'18'
}
console.log(obj) //name:"jack",age:"18"
delete obj.name //true
console.log(obj) //age:"18"
'name' in obj//false
'age' in obj //true
注意:要明白属性值为undefined和不含属性名的区别
不含属性名:'xxx' in obj===false
含有属性名,但值为undefined:'xxx' in obj&&obj.xxx===undefined
obj.xxx===undefined不能判定'xxx'是否为obj的属性
来个例子加深印象:
查
查看所有属性名:Object.keys(obj)
查看所有属性值:Object.values(obj)
查看属性名和属性值:Object.entries(obj)
查看自身+共有属性:console.log(dir)
查看特定属性:
1.中括号语法:obj['key']
2.点括号语法:obj.key
let obj={
name:'jack',
age:'18'
}
console.log(obj['name'])//jack
console.log(obj.age)//18
in和hasOwnproperty的区别
区别:
in 属性用来判断对象拥有的自身属性和共有属性,但是,不能区别该属性来自自身还是共有属性
hasOwnProperty用于判断对象是否来自自身属性,是自身属性返回true,否则返回false
let obj={
name:'jack',
age:'18'
}
console.log('name' in obj) //true
console.log('toString' in obj)//true
console.log(obj.hasOwnProperty('name'))//true
console.log(obj.hasOwnProperty('toString'))//false
解析:
name 是自身拥有的属性,所以,用in和hasOwnproperty检测都为true
toString是公共属性,in能检测出来,所以结果为true;toString用hasOwnProperty检测为false,因为 hasOwnProperty只检测自身的属性,所以为false。
改或者增
1.直接赋值
let obj={name:'jack}//这里的name是字符串
obj.name='ross'//name是字符串
obj['name']='jack'
2.批量赋值
修改或增加共有属性
无法通过自身修改或增加共有属性
let obj={}
let obj2={}
obj.toString='xxx'//只会修改自身的属性
obj2.toString
上述代码中,obj和obj2都含共有属性toString,obj.toString='xxx'只会修改自身属性,从而不会影响obj2的toString,obj2的toString还在原型上。
通过上图,得知obj和obj2它们的toString都是在原型上
从上图可以得出结论:修改自身属性,无法影响到共有属性。
如果偏要修改的话,那就修改原型上的属性吧
obj.__proto__.toString='xxx'
Object.prototype.toString='xxx'//推荐这种写法
修改隐藏属性
修改隐藏属性推荐使用Object.create
let obj={name:'ross'}
let obj2={name:'jack'}
let common={kind:'human',hairColor:'black'}
obj.__proto__=common
obj2.__proto__=common
let common={kind:'human',hairColor:'black'}
let obj=Object.create(common)
obj.name='ross'
let obj2=Object.create(common,{
name:{value:'jack'}
})
有没有很像原型链的感觉?