引用类型

概述

在学习引用类型之前,先弄清楚一些概念性的问题可能会比较好。
接下来我就以已经学习过的类型来简单说明一下几个概念之间的关系:
首先,JavaScript包含数据类型和引用类型

数据类型

  • 复杂数据类型:Object
  • 简单数据类型:Boolean、Number、String、Undefined、Null
1
2
可用typeof运算符检测给定变量的数据类型
如:alert(typeof 95);//"number"

引用类型

这是一个最大的概念,也称为本地对象或者类

  • 内置对象:Global、Math
  • 基本包装类型(特殊的引用类型):Boolean、Number、String

与其他引用类型相似:具有与各自的基本类型相应的特殊行为。
不同:自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间,然后立即被销毁。当然,可以使用new操作符显示创建对象,虽说绝对必要的情况才这样,但我觉得好像大多是这样做的(我的错觉?)

  • 其他:Object、Array、Date、RegExp、Function

每一个引用类型都有相应的属性和方法,其中又分为静态和实例

  • 静态属性、方法:无需创建对象实例,可直接通过引用类型调用(内置对象中的都为静态属性和方法)
  • 实例属性、方法:每个对象实例都具有的(其他引用类型中常用的方法均为实例方法)

1
2
3
由于无论引用的是什么类型的对象,typeof运算符都返回"object"
可用instanceof运算符识别正在处理的对象的具体类型
如:alert(95 instanceof Number);//true

数据类型和引用类型的不同

在内存中的存储方式不同

  • 原始数据类型在内存中是栈存储。是自动分配的内存,由系统自动释放。
  • 引用类型在内存中是堆存储。是动态分配的内存,大小不定也不会自动释放。

引用类型

内置对象 (不必实例化)

  • Global对象

用法

1
window.属性(方法)/属性(方法)

小结

1、这是最特别的一个对象,不管从什么角度看,它都是不存在的
2、不属于任何其他对象的属性和方法,最终都是它的属性和方法
3、在全局作用域中定义的属性和函数,都是Global对象的属性
4、Web浏览器将这个全局对象作为window对象的一部分加以实现,因此,在全局作用域中声明的所有变量和函数,都成为window对象的属性

相关属性与方法详见书中131

  • Math对象

用法

1
Math.属性(方法)

为保存数学公式和信息提供了一个公共位置

相关属性与方法详见书中134

基本包装类型(使用new操作符)

  • Boolean类型

用法

调用Boolean构造函数并传入true或false值

1
var booleanObject=new Boolean(true);

相关属性与方法详见书中120

  • Number类型

用法

调用Number构造函数时向其传递相应的数值

1
var numberObject=new Number(10);

相关属性与方法详见书中120

  • String类型

用法

1
var stringObject=new String("hello");

相关属性与方法详见书中122

其他引用类型(使用new操作符)

  • Object类型

    用法

    1、使用Object构造函数
1
2
3
var person=new Object();
person.name="greg";
person.age=27;

2、使用字面量表示法

1
2
3
4
var person={
name:"greg",
age:27
};

相关属性与方法详见书中83

  • Array类型

    用法

    1、使用Array构造函数
1
2
3
4
若知道数组要保存的项目数量,可传参,为length属性的值
var colors=new Array();
可省略new操作符
var colors= Array();

2、使用数组字面量表示法

1
2
var colors=["red","yellow"];
var names=[];//空数组

相关属性与方法详见书中86

  • Date类型

    用法

1
2
3
4
5
6
7
8
不传参,即获得当前日期和时间
var now=new Date();
传入表示某日期的毫秒数,返回该日期和时间
其中有相应的方法可获取某日期的毫秒数Date.parse()和Date.UTC()
var someDate=new Date(Date.parse("July 14,2017"));
等价于var someDate=new Date("July 14,2017");
var someDate=new Date(Date.UTC(2017,6,14));
等价于var someDate=new Date(2017,6,14);//UTC时间

相关属性与方法详见书中98

  • RegExp类型

    用法

    1、使用RegExp构造函数
1
var pattern=new RegExp("pattern","gim");

2、使用字面量表达式(常用)

1
2
3
4
var pattern =/pattern/gim;
g:全局模式
i:不区分大小写
m:多行模式

相关元字符、实例属性、实例方法、静态属性详见书中103

  • Function类型

    用法

    1、使用函数声明语法定义(常用)
1
2
3
4
解析器会率先读取函数声明,并使其在执行任何代码前可用
function sum(num1,num2){
return num1+num2;
}

2、使用函数表达式定义

1
2
3
4
5
6
必须等解析器执行到函数表达式所在的代码行,才会真正被解释执行
var sum=function(num1,num2){
return num1+num2;
};
无需函数名,通过变量即可引用函数
PS:函数末尾有一个分号,同声明其他变量一样

3、使用Function构造函数(不推荐使用)

1
var sum=new Function("num1","num2","return num1+num2");

小结

  1. 没有重载:当声明了两个同名函数时,后面的将覆盖前面的函数
  2. 作为值的函数:像传参一样把函数传递,即访问函数的指针,而不是执行函数
  3. 内部属性:(有点绕有点难懂,我觉得很少用)
    arguments.callee:指针,指向拥有 arguments对象的函数;arguments.callee.caller:指向(调用了(拥有arguments对象)的函数)的函数

相关属性与方法详见书中110

-------------本文结束 感谢您的阅读-------------