概述
在学习引用类型之前,先弄清楚一些概念性的问题可能会比较好。
接下来我就以已经学习过的类型来简单说明一下几个概念之间的关系:
首先,JavaScript包含数据类型和引用类型
数据类型
- 复杂数据类型:Object
- 简单数据类型:Boolean、Number、String、Undefined、Null
1 | 可用typeof运算符检测给定变量的数据类型 |
引用类型
这是一个最大的概念,也称为本地对象或者类
- 内置对象:Global、Math
- 基本包装类型(特殊的引用类型):Boolean、Number、String
与其他引用类型相似:具有与各自的基本类型相应的特殊行为。
不同:自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间,然后立即被销毁。当然,可以使用new操作符显示创建对象,虽说绝对必要的情况才这样,但我觉得好像大多是这样做的(我的错觉?)
- 其他:Object、Array、Date、RegExp、Function
每一个引用类型都有相应的属性和方法,其中又分为静态和实例
- 静态属性、方法:无需创建对象实例,可直接通过引用类型调用(内置对象中的都为静态属性和方法)
- 实例属性、方法:每个对象实例都具有的(其他引用类型中常用的方法均为实例方法)
1 | 由于无论引用的是什么类型的对象,typeof运算符都返回"object" |
数据类型和引用类型的不同
在内存中的存储方式不同
- 原始数据类型在内存中是栈存储。是自动分配的内存,由系统自动释放。
- 引用类型在内存中是堆存储。是动态分配的内存,大小不定也不会自动释放。
引用类型
内置对象 (不必实例化)
用法
1 | window.属性(方法)/属性(方法) |
小结
1、这是最特别的一个对象,不管从什么角度看,它都是不存在的
2、不属于任何其他对象的属性和方法,最终都是它的属性和方法
3、在全局作用域中定义的属性和函数,都是Global对象的属性
4、Web浏览器将这个全局对象作为window对象的一部分加以实现,因此,在全局作用域中声明的所有变量和函数,都成为window对象的属性
相关属性与方法详见书中131
用法
1 | Math.属性(方法) |
为保存数学公式和信息提供了一个公共位置
相关属性与方法详见书中134
基本包装类型(使用new操作符)
用法
调用Boolean构造函数并传入true或false值
1 | var booleanObject=new Boolean(true); |
相关属性与方法详见书中120
用法
调用Number构造函数时向其传递相应的数值
1 | var numberObject=new Number(10); |
相关属性与方法详见书中120
用法
1 | var stringObject=new String("hello"); |
相关属性与方法详见书中122
其他引用类型(使用new操作符)
1 | var person=new Object(); |
2、使用字面量表示法
1 | var person={ |
相关属性与方法详见书中83
1 | 若知道数组要保存的项目数量,可传参,为length属性的值 |
2、使用数组字面量表示法
1 | var colors=["red","yellow"]; |
相关属性与方法详见书中86
1 | 不传参,即获得当前日期和时间 |
相关属性与方法详见书中98
1 | var pattern=new RegExp("pattern","gim"); |
2、使用字面量表达式(常用)
1 | var pattern =/pattern/gim; |
相关元字符、实例属性、实例方法、静态属性详见书中103
1 | 解析器会率先读取函数声明,并使其在执行任何代码前可用 |
2、使用函数表达式定义
1 | 必须等解析器执行到函数表达式所在的代码行,才会真正被解释执行 |
3、使用Function构造函数(不推荐使用)
1 | var sum=new Function("num1","num2","return num1+num2"); |
小结
- 没有重载:当声明了两个同名函数时,后面的将覆盖前面的函数
- 作为值的函数:像传参一样把函数传递,即访问函数的指针,而不是执行函数
- 内部属性:(有点绕有点难懂,我觉得很少用)
arguments.callee:指针,指向拥有 arguments对象的函数;arguments.callee.caller:指向(调用了(拥有arguments对象)的函数)的函数
相关属性与方法详见书中110