2007/04/27 | Array.slice 函数的一个用法讨论
类别(Flash学习笔记) | 评论(2) | 阅读(328) | 发表于 12:23

有这样一段代码(网络心情 提供):

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 的变化而变化,因为它们两个是独立的。

0

评论Comments