AS3.0学习笔记--值类型和引用类型的区别

来源:互联网 发布:京东股票数据 编辑:程序博客网 时间:2024/05/21 11:35

AS3.0中基本值类型有这几种:Boolean,int,Number,String,uint。其余的数据类型都是引用类型。

除此之外还有一个很典型的特征:值类型的数据不用new关键字来创建,必须用new关键字创建的一定不是值类型。

那么值类型和引用类型到底有什么区别呢?

看例子:

 

//值类型的例子

//声明变量a,赋值为3

var a:int = 3;

//声明变量b,并将a的值赋给b

var b:int = a;


b = 9;     //改变变量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

 

b = new Array(4,5,6); 很显然是这一句起了作用,b重新指向了一个新的数组,自然就干扰不到a了。
0 0