0

我很久以前写过这段代码,当时我以为我理解了它,但现在我试图弄清楚它是如何工作的......

// 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 的水果数组?我认为数据会丢失,因为它没有返回新数组?...当我尝试使用字符串和数字时,数据确实会像预期的那样丢失。

我不知道我在写这篇文章时在做什么,但我想尝试理解这背后的逻辑。

谢谢你。

4

2 回答 2

1

String并且Number是 AS3 中的“原始”数据类型,而Array其他对象MovieClip是“复杂”或“参考”数据类型。

当您传递一个基元时,它的值会被复制,因此修改它不会影响原始值。当您传递一个复杂对象时,它实际上是对该对象在内存中地址的引用,因此您的函数正在修改原始对象。

于 2013-01-27T13:55:53.810 回答
0

当您说字符串和数字丢失了值时,我假设如下:

// 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 并更新它。

于 2013-01-27T19:24:35.323 回答