我很久以前就写过这段代码了,以为我当时就理解了这段代码,但现在我正试图把它包裹起来,看看它是如何工作的......
// Main.as
package {
public class Main {
public function Main() {
var fruit:Array = [];
UpdateClass.update(fruit);
trace(fruit); // Traces out the string pushed into it? How??? I think the data would've got lost...
}
}
}
// UpdateClass.as
package {
public class UpdateClass {
public static function update(array:Array):void {
array.push("haha, this is not a fruit!");
}
}
}
我只是不明白UpdateClass如何设法更新Main的水果阵列?我认为数据会丢失,因为它没有返回新数组?...当我使用字符串和数字尝试时,数据会像预期的那样丢失。
当我写这篇文章时,我不知道我在做什么,但我想尝试理解这背后的逻辑。
谢谢。
答案 0 :(得分:1)
String
和Number
是AS3中的“原始”数据类型,而Array
和MovieClip
等其他对象是“复杂”或“参考”数据类型。 / p>
传递基元时,会复制其值,因此修改它不会影响原始值。传递复杂对象时,它实际上是对内存中对象地址的引用,因此您的函数正在修改原始对象。
答案 1 :(得分:0)
当你说使用String和Number:
表示值丢失时,我假设有类似的内容// UpdateClass.as
package {
public class UpdateClass {
public static function update(num:Number):void {
num = 1;
}
}
}
它丢失的原因是因为你有一个对原始对象的引用为num。但是函数更新改变了对另一个包含值“1”的Number对象的引用。对于数组也是如此,如果您将另一个数组分配给传递的引用,如:
// UpdateClass.as
package {
public class UpdateClass {
public static function update(array:Array):void {
array = new Array();
array.push("haha, this is not a fruit!");
}
}
}
但是,由于你只是在传递的引用(push)上调用一个方法,'array'仍然引用原始的Array并更新它。