AS3.0中基本值类型有这几种:Boolean,int,Number,String,uint。其余的数据类型都是引用类型。
除此之外还有一个很典型的特征:值类型的数据不用new关键字来创建,必须用new关键字创建的一定不是值类型。
那么值类型和引用类型到底有什么区别呢?
看例子:
//值类型的例子
//声明变量a,赋值为3
var a:int = 3;
//声明变量b,并将a的值赋给b
var b:int = a;
b = 9;
trace("a现在的值是:"+a);
trace("b现在的值是:"+b);
//输出结果
//a现在的值是:3
//b现在的值是:9
现在可以发现,把a的值赋给b,然后我们改变了b的值,但是a的值却没有因为b的改变而改变。首先说明a很牛逼!
其次可以得出值类型的特点:直接存值,每个变量的值不因为其他变量的值的改变而改变。(值类型的数据做数据做的很有原则,比很多人要强)
下面再来看引用类型的例子,以Array为例:
//引用类型的例子
//声明变量a,新建一个数组赋值给它
var a:Array = new Array(1,2,3);
//声明变量b,把变量a引用赋值给b
var b:Array = a;
//改变b数组的第一个元素为4
b[0] = 4;
trace("a现在的值是:"+a);
trace("b现在的值是:"+b);
//输出结果
//a现在的值是:4,2,3
//b现在的值是:4,2,3
同样是把a的值赋给了b,引用类型的数据b的值改变之后,a的值也随之改变(没原则,鄙视)。
现在来看看这2种数据类型的区别在哪里。
引用类型数据存储的是引用。对象都是通过引用来操纵的,当我们操纵一个引用数据类型时,并没有操纵直接数据,而是在和这个数据的遥控器在打交道, 当”var b:Aarry = a;“这一句执行时,实际上创建了一个新的数组变量b,然后将a持有的引用(而不是值)赋值给了b。因此时间上a和b都是同时指向同一个数组对象。那么任 何一个变量做了改变,另外一个也要受影响。
来看看实际发生的事。
在本例中,第一行代码告诉Flash Player 在内存中创建一个数组[1,2,3].然后设置a持有遥控器指向这个数组,用正式的话就是把这个数组的引用赋值给变量a。第二行代码,当我们把a的值赋给 b时,其实并没有在内存中再创建一个新的数组[1,2,3],而是直接把a的引用又给了b。因此a和b的引用完全一样都是指向原来的数组[1,2,3]。 所以,当我们通过b变量改变数组时,也就是在改变了那个唯一的数组,值也就当然变了。
在来看第三种情况
var a:Array = new Array(1,2,3);
var b:Array = a;
b = new Array(4,5,6);
b[0] = 100;
trace("a现在的值是:"+a);
trace("b现在的值是:"+b);
//输出结果
//a现在的值是:1,2,3
//b现在的值是:100,5,6