【ActionScript】值类型与引用类型的区别(重要)

在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 殿堂之路,不当之处请指正。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值