JavaScript有七种数据类型,分别为number、string、symbol、bool、undefined、null和object,其中object是唯一一种复杂类型。
一、声明对象的两种语法
object可以被定义成无序的数据集合,也可以被定义成键值对的集合,下面是它的两种写法:
- 这是一种常用的简写方式,‘name’和‘age’是键(key),‘Bob’和‘18’是值(value)
let obj ={'name':'Bob','age':'18'}
- 这是正规的写法
let obj = new Object({'name':'Bob','age':'18'})
- 注意:(1)键名是字符串,可以包含任意字符,不是标识符;
(2)引号可以省略,但省略后就只能写标识符,且引号省略,键名仍为字符串。
二、如何删除对象的属性
使用delete操作符来进行删除操作,声明一个对象obj,包含属性xxx
- 使用delete http://obj.xxx或delete obj['xxx']即可删除obj的xxx属性;
- 使用obj.xxx = undefined ,属性名还在,但是值为undefined ;
- 'xxx' in obj 用来判断obj中是否还含有xxx属性,返回值为true和false;
- 'xxx' in obj && obj.xxx === undefined,含有属性名但是值为undefined;
- 不能使用http://obj.xxx === undefined来判断xxx是否为obj的属性。
三、如何查看对象的属性
- 查看自身所有属性:Object.keys(obj);
- 查看自身+共有属性:console.dir(obj)//也可以使用Object.keys 依次打印出obj.__proto__;
- 判断属性xxx是自身的还是共有的:obj.hasOwnproperty('xxx');
- 查看属性的两种方法:(1)中括号语法:obj['key];(2)点语法:obj.key
- 注意:(1)obj[key]与obj['key']是不同的,前者的key是变量,而变量key的值不一定为‘key’,在使用时要注意区分二者的用法。
(2)每个对象都有原型,原型作为对象也有原型,只是为null;
(3)定义一个对象obj={},它的原型为所有对象的原型,这个对象的原型包含所有对象的共有属性,是对象的根。
四、如何修改或增加对象的属性
1、直接赋值:name均为字符串
let obj = {name : 'Alice'}
obj.name='Alice'
obj['name']='Alice'
obj['na'+'me'] = 'Alice'
---------------------------------------------------------------------------------------------------
let key = 'name'; obj[key] = 'Alice'
//obj.key 等价于 obj['key'],因此下面这条语句通常情况下是错误的
let key = 'name'; obj.key = 'Alice'
2、批量赋值:
Object.assign(obj,{name:Alice,age:18})
3、更改共有属性(把属性xxx改为属性yyy)
(1)obj.__proto__['xxx'] = 'yyy'(不推荐使用)
(2)Object.prototype['xxx'] = 'yyy'
4、更改原型(把obj的原型改为common)
(1)obj.__proto__ = common(不推荐使用)
(2)let obj = Object.create(common)
五、补充知识点
'name' in obj和obj.hasOwnProperty('name') 的区别:
先来分别说一下in运算符和hasOwnProperty方法:
(1)in:如果指定的属性在指定的对象或其原型链中,则in
运算符返回true
。
(2)hasOwnProperty:所有继承了Object
的对象都会继承到hasOwnProperty
方法,hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
二者区别在于hasOwnProperty方法会忽略掉那些从原型链上继承到的属性,也就是说如果name是对象从原型链上继承到的属性,那么使用in运算符,结果会返回true,而使用hasOwnProperty方法,结果会返回false。