在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 } } }
为什么两种数据类型会有这么大的区别?
原因在于,引用类型数据存储的是引用。在第二个例子中,当执行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 殿堂之路,不当之处请指正。