有这样一段代码(网络心情 提供):
var pp:Array = new Array ("first", "second", "third");
var pp_new:Array = new Array ();
pp_new = pp; // A
pp_new = pp.slice (0); // B
A 行和 B 行中两种赋值方式有什么区别呢?
在说明这个问题之前,先来读一下 Array.slice 函数的说明,Array.slice 函数通常的用法是截取数组中的部分数据,将这些数据构成一个新的数组,并返回这个数组,如果您没有传递任何参数,则创建原始数组的一个副本。本例中 pp.slice (0) 效果 等同于pp.slice () 。
从帮助文件的说明中可以看出 pp.slice (0) 或是 pp.slice () 所做的都是将数据复制一份,交给另外一个数组变量进行使用。
那么 pp_new = pp 实现的又是什么功能呢?这种使用方式称为 对数组的引用。也就是说在执行了这样的命令以后,pp_new 和 pp 都指的是同一个数据块(在C语言中称 pp_new 和 pp 为指针),它们俩个可以认为是同一件事物的两个名称(或者叫 别名)。
我们可以通过以下的测试来验证一下我们的结论。
var pp:Array = new Array ("first", "second", "third");
var pp_new:Array = new Array ("dd");
pp_new = pp; // A
trace (pp_new); // 输出: first, second, third
pp[0] = "changed"; // B
trace (pp_new); // 输出: changed, second, third
pp_new = pp.slice (); // C
pp[0] = "reChanged"; // D
trace (pp); // 输出: reChanged, second, third
trace (pp_new); // 输出: changed, second, third
在 A 处实现的是对pp 数组的引用,接下来在 B 处,改变pp 中的内容,pp_new 中的内容也随之而改变,因为它们俩原本指得就是同一个数组(或者说是同一个数据块)。
在 C 处将 pp 复制一份再次交给 pp_new ,现在 pp 和 pp_new 分别代表的是两块独立的数据,在 D 处改变 pp 中的内容, 之后再测试,可以发现,pp_new 并不会随着 pp 的变化而变化,因为它们两个是独立的。