数据是一切编程语言的基石,而在ActionScript 3.0中,所有的数据都是对象。只要将数据在FLASH中的运行机制了解了,那么对以后的编程中会好理解得多。
在AS3中,数据的类型有基元数据类型(值类型)和复杂数据类型(引用类型)。对数据的操作是通过变量作为中转站来进行的,变量不是数据,只是一个指向我们要操纵的数据的遥控器。书中这样写道:变量持有引用,而引用则指向要操作的对象(数据)。因此,实际上我们是通过引用来操作对象。
在看书的时候,其中有几段话,分开来看,很容易就随着作者的思路思考下去,很容易就理解了,但是把他们放在一起,就有点头大。当然,如果能够宏观的理解了这些话,那么对数据操作的理解就不在话下了。
第一段是这样的:相比把数据类型分为基元数据类型和复杂数据类型,笔者认为,使用值类型和引用类型的分类,更加直观。在C#中,数据类型就分为值类型和引用类型。值类型直接存储值;而引用类型存储引用,指向要操作的对象(数据)。C#中的值类型对应AS3.0中的基元数据类型,C#中的引用数据类型正好对应AS3.0中的复杂数据类型。
第二段:值类型的特点:直接存值。每个变量的值不因为其他变量值的改变而改变。在AS3.0中,值类型变量持有的是指向值类型数据的引用;引用数据类型变量持有的是指向引用数据类型的引用。
看到这里,就有点晕了,前面提到过,变量持有引用,也就是说,不论是值类型的变量,还是引用类型的变量,他们持有的都是引用。既然都是操作引用,那么又有什么区别呢,这不都一样了吗?看到这里,我愈发的糊涂了。
原因在于下面这句话:值类型是一种特殊的对象,叫做不变对象。正是这种对象的特殊行为导致了我们对值类型的使用方式和引用类型并不相同。对不变对象的解释可以参看书中P22.关键就在于不变对象。
var a:int=1;
var b:int=a;//a将其引用给了b
b=2;//b重新赋值
trace(a)//输出1,按理说,都是操作的引用,那么a和b应该指向同一个引用,那么a应该输出2啊,这就是不变对象产生的作用了.在第二行代码中,a的确将引用传给了b,但是第三行的代码却不是改变他们共同指向的那个引用,共同的引用没有改变,b=2的结果是,一个新的整型不变对象被创建,其值为2,然后该不变对象的引用被赋给变量b,所以此时,a和b所指向的已经不是同一个引用了。