复制一个数组,是指生成一个新的数组,内容和原有数组一样。数组赋值经常需要用到,比较重要。
有两种复制方式:浅复制和深复制。这个概念不是数组特有的。对引用类型的数据复制方式有有浅复制和深复制的区别。
1.何时用浅复制?何时用深复制?
当数组元素全部都是基元数据类型时,即全部是值类型时,复制是没有浅复制和深复制的分别的。若要复制,使用下文中的浅复制方法即可。
但是当数组元素全部是复杂数据类型,即引用数据类型时,那么复制就会有两种选择:一种是浅复制,一种是深复制。
当数组部分元素是基元数据,部分元素是复杂数据类型时,也要考虑该采用那种复制方式。由于ActionfScrip
3 数组不是类型化数组,允许存储不同
类型的数据,因此这种情况也很常见的。对于基元数据类型的元素,不论用哪种方式复制,执行效果都是一样。只有对于复杂数据类型元素,才有神父之和浅复制的区别。
比如数组A[1,"string",[1,2,3]],其第三个元素是数组,属于复杂类型元素,则需要考虑两种复制方式的影响。其余连个元素,一个数值型,一个是字符串型,都属于基元数据类型,不需要考虑采用何种复方式。
2.浅复制
生成数组浅复制的方法很简单,只需要调用原书组的
slice 方法或者 concat 方法,不传任何参数,即可生成数组的浅复制。用法如下。
var copy:Array = originaArray.concat();var copy:Array =
originaArray.slice();
使用浅复制生成
的新数组,其各个元素存放的只是引用。两个数组中相同位置的元素存放的引用指向同一个对象。那么,如果对该元素操作,等于就是操作引用指向的对象。如果该对象状态发生变化,那么也会影响到另一个数组中相应位置的元素。这一点需要注意。
下面示例生动详细地展示了浅复制的方法,以及运用浅复制必须要注意的要点。
先解释一下代码内容。
有一个数组foo,其第一个元素是
String
型,属于值类型。它的第二个元素是 Array
型,第三个元素是 Object
型,都属于引用类型。使用
slice 方法(或 concat 方法)生成数组的 foo 的浅复制——数组 bar 。然后改动数组 bar 的元素内容,再和数组 foo
的元素一一比较。结果发现,改动数组 bar 中的值类型元素不会影响 foo 中的相应元素。但改动 bar 中的引用类型元素,则 foo
中相对应的元素也改变了。不仅新手,老手也常常忘了这一点,从而吃苦头。
示例
var objectElement:Object = {name:"kingda",web:"www.kingda.org
"};
var
arrayElement:Array = [1,2,3];
var foo:Array = ["a string
element",arrayElement,objectElement];
trace (foo);
//输出 foo 的内容:a string
element,1,2,3,[object object]
//1.使用slice方法生成 foo 的浅复制,赋值个 bar
var
bar:Array = foo.slice();
//也可以用:foo.concat();
//2.比较 foo 和 bar
trace (bar);
//输出浅复制bar的内容:a string element,1,2,3,[object
object]
//结果和foo完全一样
trace(foo==bar);
//输出:false
/*结果为false
很正确
因为对于 Array 这个引用类型,“==”判断的是变量只有对象的引用是否相同,而不是内容相同。由于 bar 是 slice 方法(或者
concat 方法)返回的一个新数组,因此不和 foo 变量原有的数组引用相同
*/
trace (foo[0] ==
bar[0]);
//输出:true
//注意,第一个元素是值类型,因此“==”是根据值(value)来判断的
trace (foo[1]
== bar[1]);
trace (foo[2] ==
bar[2]):
/*
输出:
true
true
这两个元素是引用类型,“==”是根据引用是否相同来判断的
*/
//3.
下面我们来挨个改变bar数组的所有元素,再来一一比较foo和bar
bar[0] = "a new string in
bar";
bar[1][0] = 1000;
bar[2].web = "www.actiongscript3.cn
";
trace (foo);
//输出:a string
element ,1000,2,3,[object
object]
//注意,foo中的内容除了第一个元素,其余也跟着bar变了。改变了bar,同时也改变了
foo中
//引用类型元素的内容
trace (bar);
//输出:a new string in bar
,1000,2,3,[object
object]
//可以看到,bar除了第一个元素和现在的foo不同外,其余都一样
//怎么知道第三个元素也变了呢?我来trace一下它的web属性
trace
(foo[2].web);
//输出:www.actionscript3.cn
//果然foo中第三个元素的web属性也变了
trace(bar[2].web);
//输出:www.actionscript3.cn
3.深复制
使用深复生成的新数组,其所有元素都是真正的数组元素的备份。这时两个数组中相同未知的元素,存放的是不同的引用,指向不同的对象。但是这两个独享的状态是完全一致的。
如何生成深复制?这就需要使用到强大的ByteArray
类了。方法见示例:
示例:数组的深度复制:ByteArray
的运用
var objectElement:Object ={name:"kingda",web:"www.kingda.org"
};
var
foo:Array = ["a string element",arrayElement,objectElement];
//以下4行深复制数组
foo
var fooBA:ByteArray = new
ByteArray();
fooBA.writeObject(foo);
fooBA.position = 0;
var bar:Array
= fooBA,readObject() as Array;
trace (bar);
//输出:a string
element,1,2,3,[object object]
trace (foo ==
bar);
//输出:false
//表明foo和bar持有的是两个不同对象的引用
trace (foo[0] ==
bar[0]);
//输出:true
//由于第一个元素是String型,因此“==”判断值相等,返回真
trace (foo[1] ==
bar[1]);
//输出:false
//第二个元素是Array型,因此“==”判断引用是否相同,若不同,返回假
trace (foo[2]
==
bar[2]);
//输出:false
//第三个元素是Object型,因此“==”判断引用是否相同,若不同,返回假
//以下3行改变bar的元素
bar[0]
= "a new string in bar";
bar[1][0] = 1000;
bar[2].web = "www.actionscript3.cn"
;
//在看foo是否受影响
trace
(foo);
//输出:a string element,1,2,3,[object Object]
trace (bar);
//输出:a
new string in bar,1000,2,3,[object Object]
trace (foo[2].web);
//输出:www.kngda.org
trace
(bar[2].web);
//输出:www.actionscript3.cn
//可以看出,bar的改变并没有影响foo,确确实实把所有的元素都真正复制了
分享到:
相关推荐
"深复制"和"浅复制"是两种不同的复制方式,它们在内存管理和对象引用上有着显著的区别。 首先,让我们理解“浅复制”(Shallow Copy)。浅复制是指创建一个新对象,这个新对象的指针指向的是原始对象中的数据的副本...
JavaScript中的浅复制与深复制是处理复杂数据结构(如对象和数组)时常见的概念,主要涉及到内存管理和数据拷贝的方式。这两种复制方式的区别在于它们如何处理引用数据类型的副本。 首先,JavaScript中有两种数据...
这个库的出现解决了AS3在处理Excel数据时遇到的诸多问题,尤其是字符编码问题,确保了中文数据能够正确无误地读取和写入Excel文档。 在ActionScript 3.0中,Flash Player和Air应用程序通常不直接支持读写Microsoft ...
位图处理涉及到`Bitmap`和`BitmapData`类的使用,包括像素操作、位图数据复制和压缩,以及利用杂点和mipmap技术来优化图像质量。 ### 过滤显示对象 通过应用各种滤镜,你可以为显示对象添加特效,如模糊、锐化或...
这种方法适用于将一个表的数据复制到另一个新表或者已存在的表中。基本语法如下: ```sql INSERT INTO table2 (column1, column2, ...) SELECT column1, column2, ... FROM table1 WHERE condition; ``` 在这里,`...
它支持严格类型定义和面向对象编程范式,与早期版本相比,AS3提供了更多的性能优化和新的功能特性。 在开始学习之前,需要明确本教程及所涉及软件的版权信息。Adobe保留了文档内容的所有权利,任何复制、存储或传播...
as3corelib.swc是这个库的二进制版本,包含了as3corelib的所有源代码和元数据,可以被其他Flex或Flash项目引用,以便使用其提供的功能。 要将as3corelib集成到Flex 4.5项目中,你需要执行以下步骤: 1. **导入库**...
3. **插入数据**:根据解析后的数据格式,在VSFlexGrid的指定位置插入数据。 #### 知识点六:代码实现——粘贴功能 ```vb ' 读取剪贴板中的数据 Dim clipText As String clipText = Clipboard.GetText ' 分析剪贴...
在SQL Server环境中,有时我们需要将一个数据库中的某个表复制到另一个数据库中,这可能是为了备份、数据迁移或创建测试环境等目的。根据提供的标题、描述和部分代码内容,我们可以整理出一套较为完整的操作流程和...
3. **加密和哈希**:AS3CoreLib提供了MD5和SHA-1等加密和哈希算法,用于数据安全和验证。 4. **日期和时间**:它扩展了AS3原生的Date类,提供了更强大的日期和时间处理功能,如格式化和比较。 5. **字符串工具**:...
在数据库管理中,有时我们需要将一个数据库中的表数据复制到另一个数据库的表中。这个过程可以用于数据迁移、备份、同步或测试环境的构建。在SQL中,有多种方法可以实现这种操作,根据不同的数据库系统和需求,选择...
数据库复制是指将一个数据库或表的结构和数据复制到另一个数据库或表中。这种操作可以用于数据备份、数据迁移、数据同步等目的。 批量插入数据 批量插入数据是指将大量数据一次性插入到数据库表中。这种操作可以...
如果涉及到复杂的对象数组,需考虑深拷贝和浅拷贝的区别。 五、实际应用示例 在实际编程中,数组复制常用于数据备份、数据处理和并发场景。例如,在一个多线程程序中,为了防止并发修改数据引发的问题,可能需要先...
上述代码将整个Excel文件中的数据复制到了名为"新数据.xlsx"的新文件中,且创建了一个名为"新工作表"的单个工作表。然而,如果我们只需要复制部分数据,可以对DataFrame进行筛选或切片操作,然后再写入。 此外,...
AS3提供了`flash.net.URLLoader`类用于加载数据,无论是文本、XML还是二进制文件。`URLLoader`可以与`URLRequest`对象一起使用,指定要加载的URL。此外,`URLLoader`有一个`data`属性,用于存储加载的数据,以及`...
3. **事务处理**:在进行大规模数据复制时,为了确保数据的一致性和完整性,可能需要在事务中执行复制操作。这样,如果复制过程中出现错误,可以回滚整个操作。 4. **触发器和存储过程**:如果原表包含触发器或存储...
11. **使用位图**:探讨位图使用的基础知识,包括Bitmap和BitmapData类、像素处理、位图数据复制、杂点功能和mipmap处理。 12. **过滤显示对象**:介绍过滤显示对象的基础知识,创建和应用滤镜的技巧,以及...
3. **增量数据复制(Incremental Data Replication)** 数据增量复制技术是大数据处理中的关键组成部分。文件中提到的ReAir系统可能是指Airbnb内部开发的增量复制工具或系统。ReAir的目的可能是为了提高数据处理的...
AS3是Flash Professional和Flex Builder等开发工具中的主要编程语言,它提供了面向对象的编程能力,具有更高的性能和更严谨的语法。AS3中的一切都是一个对象,包括舞台(Stage)和显示列表。 2. **舞台(Stage)...
- **FlashCopy**:这是一种高效的数据复制技术,可以实现近实时的数据复制。 - **ProtecTIER**:这是 IBM 的数据压缩和去重技术,可以帮助减少备份数据所需的存储空间。 - **集群和高可用性支持**:PowerHA for i ...