1

ActionScript 的 Array 和 Vector 类都有一个 slice() 方法。如果不传递任何参数,则新的 Array 或 Vector 是原始 Vector 的副本(浅克隆)。

“浅克隆”是什么意思?具体来说,有什么区别

Array newArray = oldArray.slice();
Vector.<Foo> newVector = oldVector.slice();

Array newArray = oldArray;
Vector.<Foo> newVector = oldVector;

? 另外,如果 Vector 的基本类型不是 Foo,而是像 int 这样简单且不可变的东西怎么办?

更新:

下面的结果是什么?

var one:Vector.<String> = new Vector.<String>()

one.push("something");
one.push("something else");

var two:Vector.<String> = one.slice();

one.push("and another thing");

two.push("and the last thing");

trace(one); // something, something else, and another thing
trace(two); // something, something else, and the last thing

谢谢!♥</p>

4

1 回答 1

1

在您的上下文中,.slice()所做的只是复制您的向量,以便从newArray引用不同的对象oldArray,除非两者看起来是相同的对象。同样适用于newVectoroldVector

第二个片段:

Array newArray = oldArray;
Vector.<Foo> newVector = oldVector;

实际上引用newArray了. _ 这意味着两个变量都引用同一个数组。and相同——两者最终都指向同一个向量。可以把它想象成用橡皮图章在不同的纸上两次印上同一个印章:它是同一个印章,只是出现在两张纸上。oldArraynewVectoroldVector

附带说明一下,术语浅拷贝深拷贝的不同之处在于,浅拷贝仅是对象的副本,而深拷贝是对象及其所有属性的副本。

另外,如果 Vector 的基本类型不是 Foo,而是像 int 这样简单且不可变的东西怎么办?

是一样的,因为你的变量是指Vector对象而不是它们int的 s。

下面的结果是什么?

您的输出是正确的:

某事,某事,另一件事
某事,某事,最后一件事

two = one.slice()one,不带任何参数,创建一个包含所有当前内容的新副本并将其分配给two. 当您将第三个项目推送到oneandtwo时,您将附加到不同的Vector对象。

于 2011-02-23T16:20:49.313 回答