JavaScript有七种数据类型,分别为number、string、symbol、bool、undefined、null和object,其中object是唯一一种复杂类型。
object对象
定义
- 无序的数据集合
- 键值对的集合
声明对象的两种语法
object可以被定义成无序的数据集合,也可以被定义成键值对的集合,下面是object的两种写法:
- 下面是一种常用的简写方式,‘name’和‘age’是键(key),‘Alex’和‘18’是值(value)
let obj ={'name':'Alex','age':'18'}
- 下面是正规的写法
let obj = new Object({'name':'Alex','age':'18'})
- 下面是命名一个对象
console.log({'name':'frank','age':18})
注意
- 键名是字符串,可以包含任意字符,不是标识符;
- 引号可以省略,但省略后就只能写标识符,且引号省略,键名仍为字符串。
如何删除对象的属性
首先声明一个对象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。
注意:
不能使用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。
注意:
- obj[key]与obj[‘key’]是不同的,前者的key是变量,而变量key的值不一定为‘key’,在使用时要注意区分二者的用法;
- 每个对象都有原型,原型作为对象也有原型,只是为null;
- 定义一个对象obj={},它的原型为所有对象的原型,这个对象的原型包含所有对象的共有属性,是对象的根。
如何修改或增加对象的属性
- 直接赋值:name均为字符串
let obj = {name : 'Alex'}
obj.name='Alex'
obj['name']='Alex'
obj['na'+'me'] = 'Alex'
--------------------------------------------------------
let key = 'name'; obj[key] = 'Alex'
//obj.key 等价于 obj['key'],不等价于obj[key]因此下面这条语句通常情况下是错误的
let key = 'name'; obj.key = 'Alex'
- 批量赋值
Object.assign(obj,{name:Alex,age:18})
- 更改共有属性(把属性xxx改为属性yyy)
obj.__proto__['xxx'] = 'yyy'(不推荐使用)
Object.prototype['xxx'] = 'yyy'
- 更改原型(把obj的原型改为common)
obj.__proto__ = common(不推荐使用)
let obj = Object.create(common)
注意:
- 一般不修改原型;
- 强烈不推荐使用__proto__代码;
‘name’ in obj和obj.hasOwnProperty(‘name’) 的区别
in
:如果指定的属性在指定的对象或其原型链中,则in
运算符返回true
;hasOwnProperty
:所有继承了Object的对象都会继承到hasOwnProperty
方法,hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。- 二者区别在于
hasOwnProperty
方法会忽略掉那些从原型链上继承到的属性,也就是说如果name
是对象从原型链上继承到的属性,那么使用in
运算符,结果会返回true
,而使用hasOwnProperty
方法,结果会返回false。