- 基本理解
- js原生引用类型
- Object类型
- Array类型
- Date类型
- RegExp类型
- Function类型
- 基本包装类型
- 单体内置对象
基本理解
引用类型是一种用于将数据和功能组织在一起的数据结构(也常被成为类),引用类型的值(对象)是引用类型的一个实例。
但是js中没有类的概念,因此引用类型也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。
对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的,构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
ECMAScript提供了很多原生引用类型(如:Object),以便开发人员用以实现常见的计算任务
js原生引用类型
Object类型
我们看到的大部分引用类型都是Object类型的实例,Object的实例本身不具备很多功能,单对于在应用程序中存储和传输数据而言,是非常理想的选择。
Array类型
除了Object之外,Array算是js最常用最常用的类型。js中的数组与其他语言的数组都是数据的有序列表,但是,数组的每一项可以保存任何类型的数据
Date类型
js中用于构建日期对象的引用类型
RegExp类型
js通过RegExp类型来支持正则表达式
Function类型
js中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。如:
这与使用函数表达式定义函数的方法几乎相差无几:
基本包装类型
为了便于操作基本数据类型值,js还提供了3个特殊的引用类型:Boolean、Number、String。这些类型与其他引用类型相似,但有与各自的基本数据类型相应的特殊行为。
注意:
实际上,每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们可以能够调用一些方法来操作这些数据,如:
var s1 = "hello,world"; var s2 = s1.substring(2);
尽管如我们所愿,基本类型调用了方法,但是基本类型不是对象,因而从逻辑上讲他们不应该具有方法。
其实,为了实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问s1时,访问过程处于一种读取模式,也就是从内存中读取这个字符串的值,而在读取模式中访问字符串时,后台都会自动完成以下处理:
- 创建String类型的一个实例
- 在实例上调用指定的方法
- 销毁这个实例
经过处理,基本的字符串就变得跟对象一样了
引用类型与基本包装类型的主要区别就是对象的生存期。使用new创建的引用类型实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,只存在一行代码的执行瞬间,然后立即被销毁。这也意味着我们不能在运行时为基本类型值添加属性和方法
单体内置对象
单体内置对象是由ECMAScript实现提供的,不依赖宿主环境的对象,也就是开发人员不必显示地实例化内置对象,因为它们已经实例化了。如:Object、Array、String。
还有两个内置对象比较重要:Global和Math
实际上全局变量或全局函数是不存在的,所有在全局作用域中定义的属性和函数,都是Global对象的属性。如:parseInt(),parseFloat()都是Global对象的方法。