ActionScript 3中数据类型
基元数据类型:Boolean、int、Number、String、uint
复杂数据类型:复杂的数据类型往往是由一些基元数据类型构成的。如Array,可以直接由一些数字或者字符串作为元素组成。更高级点的其组成元素也是复杂数据类型。比如Object和Array嵌套。常用的ActionScript 3复杂数据类型有:Arrary、Date、Error、Function、RegExp、和XMLList。

变量的本质
在ActionScript 3中,所有数据都是对象。我们通过变量来操作对象。变量持有引用(Reference),而引用则指向要操作的对象。因此,实际上我们是通过引用来操作对象。引用好比是一个遥控器,变量是遥控器的名字。
引用(Reference)的真正实现机理:
每个对象在生成时,都会在内存中请求一块空间来保存它的数据。根据对象的大小和类型,它可能需要占用的空间大小也不等。访问对象的时候,我们不是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,可以把它想象为类似C语言中指针的东西,它指示了对象在内存中的地址。在ActionScript 3中这些对用户都是不可见的,我们不能够观察到这个地址究竟是什么。我们也不需要知道它,有引用就可以操作对象了。

值类型和引用类型的区别在C#中,数据类型分为值类型和引用类型。值类型直接存储值;而引用类型存储引用,指向要操作的对象。C#中的值类型正好对应于ActionScript 3中的基本数据类型,C#中的引用类型正好对应于ActionScript 3中的复杂数据类型。
ActionScript 3中基本类型只有Boolean、int、Number、String和uint。只有这几种属于值类型,其余数据类型都是引用类型。
另外,有一个典型的特征:值类型的数据不用new的关键字来创建:必须使用new的关键字创建的一定不是值类型。
黑羽举了个例子:
var a:Array=new Array(1,2,3);
var b:Array=a;
b[0]=4;
trace(“a现在的值是:“ + a);
trace(“b现在的值是:“ + b);
*//输出结果:*
*//a
现在的值是:4,2,3*
*//b
现在的值是:4,2,3*可以看出,由于Array是引用类型,所以改变b的值会影响到a的值。

不变对象
值类型数据和引用类型数据的操作有着很大的不同。但是,这两种数据类型的变量持有的都是引用。既然是引用,就都是指向对象的。
ActionScript 3中的值类型本质上仍然是对象,那么,即使是值类型变量,存储的仍然是引用,而不是直接持有值。但是,值类型是一种特殊的对象,叫做不变对象** (immutable object)。正是这种对象的特殊行为导致了我们对值类型的使用方式和引用类型并不相同。
不变对象,一旦被建立后,就不能再被更改。一旦虚拟机发现指向一个
不变对象的引用要改变该不变对象的值,就会另行创建一个新的不变对象来接受新的值,将变量持有的引用指向新创建的不变对象**,而之前指向的不变对象由于它不再被使用,会被虚拟机自动回收。
为什么要设计出不变对象,而不采用直接存值的方式呢?一方面,将基元数据类型用不变对象的方式实现,使得引用的效率和传值一样高。另一方面,由于变量持有的是引用,而不是直接持有值,导致不变对象可以被重复引用,对内存的使用率会大大提高。