1.对象
1. 1 认识对象
对象在JS中有狭义对象、广义对象两种。
1.1.1 狭义对象
所谓狭义对象,就是用 {} 这种字面量形式定义的对象,它是一组属性的无序集合:
上面这个对象,表示一个“人”,里面有四个属性,换句话说,这个对象里面除了4个属性,别的什么都没有。
所以我们想一想,所谓的对象到底是什么?表达的哲学又是什么?
比如我们现在不用对象,而用一组数组来存储一组值:
数组只能存储值,不能存储键,换句话说,数组里面的值的“语义”不详。对象除了能存储值,还能存储值的“语义”。值的“语义”,叫做keys——键。
也就是说,对象就是一组值和值的“语义”的封装。
1.1.2 广义对象
广义对象也是对象,但你感觉它除了一组属性还有别的东西。
比如DOM元素是对象,但是和我们刚才说的“里面只有一组值,别的什么都没有”不同。
我们通过DOM方法得到了一个DOM对象,此时可以通过 点语法 来给这个对象添加name、age、sex、hobby属性。此时可以通过o.sex访问它的sex属性,此时,你不能说这个对象只有name、age、sex、hobby这四个属性,别的什么都没有!因为这个o毕竟有一个HTML标签实体在页面上。
再来看数组,数组也是对象:
我们也可以通过点语法,给数组添加属性:
说明数组有对象的一切特征,就是能够添加属性,但是你不能说这个数组此时只有name、age、sex、hobby这四个属性,别的什么都没有,毕竟它有一组数!
再来看函数,函数也是对象,但是用 typeof 运算符检测类型,返回的结果是 function,不是 object,这是系统规定,但是function 也是object,这个问题会在之后讨论。
此时我们要证明这个fun也是一个对象,怎么证明,给它加属性!如果能加上属性就说明是对象:
此时对象添加属性成功,但是你不能说fun对象只有xingming、age、sex、hobby这四个属性,别的什么都没有,因为毕竟它是一个函数,可以加圆括号 ( ) 执行!
再比如正则表达式,也是一个对象:
添加属性成功,但是你不能说只有这些属性,毕竟它是一个正则!
也就是说,系统内置的所有引用类型值,都是对象,它们都能添加自定义属性,并且能够访问这些属性:
- function 函数
- array 数组
- regexp 正则表达式
- DOM 元素
- window、document、Date 、Math
- Number、String内置包装构造函数得到的值
但是这些对象除了一组属性之外,还有其他的东西。比如数组还有一组值;比如函数还有一组语句,能够圆括号执行。
什么不是对象?就是系统的基本类型值:
数字不能加属性,因为数字是基本类型值,不是对象:
字符串不能加属性,因为字符串是基本类型值,不是对象:
要记住,除了系统能够送给我们的“除了属性还有别的东西的”对象,我们自己是不能创建这种东西的。也就是说,对于开发者而言,我们只能创建狭义对象。
那到底有什么性质,我们就称为它是对象呢?能够添加属性!特别的,微观层面,只要这个东西存放在堆内存中就可以认为是一个对象。