【问题标题】:What does it mean for .slice() to be a "shallow clone"?.slice() 成为“浅克隆”意味着什么?
【发布时间】:2011-02-23 16:08:34
【问题描述】:

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

谢谢! ♥

【问题讨论】:

    标签: arrays actionscript vector slice shallow-copy


    【解决方案1】:

    在您的上下文中,.slice() 所做的只是复制您的向量,以便 newArray 引用与 oldArray 不同的对象,但两者看起来是相同的对象。 newVectoroldVector 也是如此。

    第二个sn-p:

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

    实际上使newArray 成为oldArray引用。这意味着两个变量都引用同一个数组。 newVectoroldVector 也一样——最终都指向同一个向量。可以把它想象成使用橡皮图章在不同的纸上两次印上同一个印章:它是同一个印章,只是在两张纸上表示。

    顺便说一句,浅拷贝深拷贝的不同之处在于,浅拷贝是仅对象的拷贝,而深拷贝是对象及其所有属性的副本

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

    相同,因为您的变量引用的是 Vector 对象,而不是它们的 ints。

    下面的结果是什么?

    你的输出是正确的:

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

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

    【讨论】:

    • 你的意思是oldArraynewArray的内容是相同的Object,但是引用不同?
    • @Svetlana:oldArraynewArray 所代表的对象在你.slice() 时是不同的,但是如果它们是非原始类型,它们的属性的引用可能会有所不同。如果您只是将一个分配给另一个,那么两者都是对同一对象的不同引用。
    猜你喜欢
    • 2013-04-28
    • 2018-02-23
    • 2023-03-10
    • 2011-10-17
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多