对象object是Javascript的数据类型之一,也是唯一一种复杂类型。对象是无序的数据集合,也是键值对的集合。
- 声明对象的两种语法
let obj = {'name': 'frank', 'age': 18}
let obj = new Object({'name': 'frank', 'age': 18})
以上两种写法都声明了一个名为obj的对象,这个对象中有name和age两个自身属性,且name属性的值为frank,age属性的值为18。其中name和age是该对象的属性名(property),frank和18是该对象的属性值。
需要注意的是:键名是字符串,不是标识符,可以包含任意字符;引号可以省略,省略之后就只能写标识符;就算引号省略了,键名也还是字符串。
也可以用变量做属性名:
let p1 = 'name'
let obj = {[p1]: 'frank'}
加了[]的属性名会被当做变量求值。
- 对象的隐藏属性
JS中的每一个对象都有一个隐藏属性(
__proto__),这个隐藏属性存储着其共有属性组成的对象的地址,这个共有属性组成的对象叫做原型,也就是说,隐藏属性储存着原型的地址。
对象的原型也是对象,所以对象的原型也有原型,obj = {}的原型即为所有对象的原型,这个原型包含所有对象的共有属性,是对象的根。这个原型也有原型,是null。
- 如何删除对象的属性
delete obj.xxx
或
delete obj['xxx']
以上两种方法即可删除obj的xxx属性。
需要注意的是:'xxx' in obj === false 表示obj不含xxx属性名;
'xxx' in obj && obj.xxx === undefined表示obj含有xxx属性名但是值为undefined。
- 如何查看对象的属性
Object.keys(obj) //查看obj自身所有属性;
console.dir(obj) //查看obj自身+共有属性。
示例如下:
可以通过obj.hasOwnProperty('toString')判断一个属性是自身的还是共有的。
两种方法查看属性:
obj['key']
obj.key
注意:obj[key]这种写法中key为变量!不可与上述两种混淆。
- 如何修改或增加对象的属性 直接赋值:
let obj = {name: 'frank'} // name是字符串
obj.name = 'frank' // name是字符串
obj['name'] = 'frank'
obj['na' + 'me'] = 'frank'
let key = 'name';
obj[key] = 'frank'
批量赋值:
Object.assign(obj, {age: 18, gender: 'man'})
改共有属性:
Object.prototype['toString'] = 'xxx'
改原型:
let obj = Object.create(common)
增加对象的属性的做法基本同改,当已有属性则改;没有属性则增。
- 'name' in obj和obj.hasOwnProperty('name') 的区别
两个都是判断obj对象中是否有name属性。不同的是
'name' in obj是从obj的自身和共有属性中查找是否含有name属性,而obj.hasOwnProperty('name')则只从obj的自身属性中查找是否含有name属性。