在ActionScript中,
基本数据类型有boolean、int、number、string、uint;其余的全部是引用数据类型如array。。。
值类型数据不用new关键字来创建,需要用new关键字创建的全部都一定不是值类型。
不过如果要是真看上去那么简单,那笔者就没有发表这篇文章的必要了。
咱们来看第一个的例子:(值类型)
package courseTest
{
public class NumberType_1
{
public function NumberType_1()
{
//值类型例子
//声明变量a,赋值为3
var a:int = 2;
//声明变量b,并把a赋值给b
var b:int = a;
//改变b的值
b = 3;
trace("a的值为:"+a); //输出2
trace("b的值为:"+b); //输出3
}
}
}
总结:从输出结果来看,a赋值给b之后,改变了b的值,但是a并没有因此而变化。那是因为值类型是直接存值的。
第二个例子:(引用类型)
package courseTest
{
public class NumberType_2
{
public function NumberType_2()
{
//引用类型例子
//声明变量a,新建一个数组赋值
var a:Array = new Array(1,2,3);
//声明变量b,把a赋值给b
var b:Array = a;
//改变b数组的第一个元素
b[0] = 0;
trace("a的值为"+a); //输出: 0,2,3
trace("b的值为"+b); //输出: 0,2,3
}
}
}
总结:注意上面a的输出值, 为什么b值的改变会引起a的变化呢? 这就是大部分初学者经常犯的错误,也是这篇文章的写作原因。
为什么两种数据类型会有这么大的区别?
原因在于,引用类型数据存储的是引用。在第二个例子中,当执行var b:Array = a; 这一句时,实际上是创建了一个数组变量b,将a的引用(不是值)值赋给b。b创建的时候并没有在内存内新建一个数组,而是直接把指针指向了a的引用。因此b的引用和a的引用完全一样。所以但我们企图改变b的时候,同时也改变了a。
理解上面两个例子吗?好,如果你准备好了,接下来再来一个可以更加说明例子二的事例。
例子三
package courseTest
{
public class NumberType_2
{
public function NumberType_2()
{
//创建一个数组a,并把它的引用赋值给b
var a:Array = new Array(1,2,3);
var b:Array = a;
//再新建一个数组b
b = new Array(4,5,6);
b[0] = 99;
trace("a的值为"+a); //输出: 1,2,3
trace("b的值为"+b); //输出: 99,5,6
}
}
}
你猜猜结果为什么是这样呢?
哦~请看b = new Array(4,5,6) 这行代码,原来new 关键字让flash player又创建了一个新的数组并让b指向了它,那a指向的不是数组b吗?虽然a把引用赋值给了b,但是因为在内存区域新建了一个数组所以b不收a的影响,两者指向内存中不同的数组。
参考于:ActionScript 3 殿堂之路,不当之处请指正。