`
qzriso
  • 浏览: 236523 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

as3数据的浅复制和深复制

Web 
阅读更多

复制一个数组,是指生成一个新的数组,内容和原有数组一样。数组赋值经常需要用到,比较重要。

有两种复制方式:浅复制和深复制。这个概念不是数组特有的。对引用类型的数据复制方式有有浅复制和深复制的区别。

1.何时用浅复制?何时用深复制?

当数组元素全部都是基元数据类型时,即全部是值类型时,复制是没有浅复制和深复制的分别的。若要复制,使用下文中的浅复制方法即可。

但是当数组元素全部是复杂数据类型,即引用数据类型时,那么复制就会有两种选择:一种是浅复制,一种是深复制。

当数组部分元素是基元数据,部分元素是复杂数据类型时,也要考虑该采用那种复制方式。由于ActionfScrip 3 数组不是类型化数组,允许存储不同 类型的数据,因此这种情况也很常见的。对于基元数据类型的元素,不论用哪种方式复制,执行效果都是一样。只有对于复杂数据类型元素,才有神父之和浅复制的区别。

比如数组A[1,"string",[1,2,3]],其第三个元素是数组,属于复杂类型元素,则需要考虑两种复制方式的影响。其余连个元素,一个数值型,一个是字符串型,都属于基元数据类型,不需要考虑采用何种复方式。

2.浅复制

生成数组浅复制的方法很简单,只需要调用原书组的 slice 方法或者 concat 方法,不传任何参数,即可生成数组的浅复制。用法如下。

Copy code
var copy:Array = originaArray.concat();var copy:Array = originaArray.slice();



使用浅复制生成 的新数组,其各个元素存放的只是引用。两个数组中相同位置的元素存放的引用指向同一个对象。那么,如果对该元素操作,等于就是操作引用指向的对象。如果该对象状态发生变化,那么也会影响到另一个数组中相应位置的元素。这一点需要注意。

下面示例生动详细地展示了浅复制的方法,以及运用浅复制必须要注意的要点。
先解释一下代码内容。
有一个数组foo,其第一个元素是 String 型,属于值类型。它的第二个元素是 Array 型,第三个元素是 Object 型,都属于引用类型。使用 slice 方法(或 concat 方法)生成数组的 foo 的浅复制——数组 bar 。然后改动数组 bar 的元素内容,再和数组 foo 的元素一一比较。结果发现,改动数组 bar 中的值类型元素不会影响 foo 中的相应元素。但改动 bar 中的引用类型元素,则 foo 中相对应的元素也改变了。不仅新手,老手也常常忘了这一点,从而吃苦头。

示例

Copy code
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 的运用

Copy code
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,确确实实把所有的元素都真正复制了
分享到:
评论

相关推荐

    javascript浅复制与深复制

    浅复制与深复制只存在于引用数据类型当中 基本数据类型储存在栈内存当中 栈内存是一个萝卜一个坑 互不影响 引用数据类型储存在堆内存当中 堆内存是一片储存空间,引用数据类型存储在堆内存中的是一个内存地址 ,...

    oracle复制表结构和复制表数据语句分享

    1. 复制表结构及其数据: 代码如下:create table table_name_new as select * from table_name_old2. 只复制表结构: 代码如下:create table table_name_new as select * from table_name_old where 1=2;或者: 代码...

    浪潮AS1000G2的数据快照功能详解

    AS1000G2光纤磁盘存储系统提供了直观易用的Snapshot功能,可以帮助用户实现在不中止应用数据的情况下进行...Snapshot功能搭配数据卷复制功能使用,可以提供更为广泛的数据应用,比如更深层次的应用测试以及数据挖掘等。

    Python数据分析实践:透视表和重塑dataframenew.pdf

    2022/3/14 4.9 透视表和重塑dataframe In [ ]: import numpy as np import pandas as pd 在数据分析中,常常需要用到数据透视表和交叉表,下面介绍pandas.DataFrame.pivot_table数据透视表和pandas.DataFrame....

    把表信息从一个表复制到另外一个表

    把表信息从一个表复制到另外一个表。部分程序如下:利用VB语句调用ACCESS数据库,将一张表的全部信息复制到另一张表中 Private Sub Command1_Click() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim ...

    浪潮AS1000G2的数据卷隔离映射功能详解

    浪潮新近推出了4Gb光纤磁盘存储系统AS1000G2,该浪潮自有高端光纤磁盘存储系统除了高品质的硬件设计之外,在管理软件中还配备了四个功能强大的数据应用功能:数据卷隔离映射功能、数据快照功能、数据复制功能和数据...

    MySQL中表复制:create table like 与 create table as select

    主要介绍了MySQL中表复制:create table like 与 create table as select,需要的朋友可以参考下

    javascript对浅拷贝和深拷贝的详解

    下面小编就为大家带来一篇浅谈JavaScript中面向对象的的深拷贝和浅拷贝。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。 1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。 ...

    数据管理平台 Apache Geode.zip

    它使用了动态数据复制和分区技术来实现高可用, 高性能, 高可扩展性, 和容错. 另外, 对于一个分布式数据容器, Apache Geode 是一个基于内存的数据管理系统, 提供了可靠的异步事件通知和可靠的消息投递.Apache Geode ...

    AS400 RLU编程wrod版

    2.1 从AS/400主菜单启动RLU 2.2 从PDM启动RLU 2.3 启动RLU的命令(STRRLU) 第三章 设计一个报表 3.1 使用顺序行命令的规则 3.2 使用命令行命令的规则 3.3 使用CL命令的规则 3.4 修改编辑对话环境 SET命令 3.5 定位...

    deepcopy.js:深度复制数据

    deepcopy.js 深度复制数据安装npm $ npm install deepcopy用法node.jsJavaScript const deepcopy = require ( 'deepcopy' ) ;打字稿import * as deepcopy from 'deepcopy' ;浏览器< script src =" deepcopy.min....

    彩虹UDA软件狗工具带硬复制工具

    3 对于 C 语言及其它编译型语言,配套软件中提供可链接的模块文件 (OBJ 文件 ) , 模块文件中提供两个函数 :(1) 写数据 ; ⑵读数据。开发商可在要加密软件的源码中加入适当的调用语句,对软件狗进行读写操作,以确定...

    MySQL复制表的三种方式(小结)

    复制表结构及其数据 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。 create table table_name_new as (select * from table_name_old); 只复制...

    拉勾数据分析岗数据分析报告.pdf

    拉勾数据分析岗数据分析报告 简介:试着,做了⼀个拉勾⽹数据分析师职位的数据分析。 其实,虽然很想做数据分析师,但是是跨⾏,⼼⾥相当忐忑,做这个分析就相当于加深⾃⼰对数据分析这个⾏业的了解了。 ⼤致思路 ⼤...

    JavaScript对象拷贝与Object.assign用法实例分析

    因此对 JavaScript 中的复杂数据类型(object)来说,也会有浅拷贝和深拷贝的概念:浅拷贝指两个不同的变量存的是同一个对象的地址,即两个变量指向同一块内存区域;深拷贝则是重新分配了一块内

    易语言调用as_zlib压缩解压源码

    as使用的ByteArray类:compress 和 uncompress 方法。易语言对象载入flash,源码来自论坛网友分享的源码,需要写本地文件,有点麻烦!。尝试过用酷哥的支持库,内存加载swf字节集,经测试发现,CallFunction方法接收...

    通用MapReduce程序复制HBase表数据

    编写MR程序,让其可以适合大部分的HBase表数据导入到HBase表数据。其中包括可以设置版本数、可以设置输入表的列导入设置(选取其中某几列)、可以设置输出表的列导出设置(选取其中某几列)。 原始表test1数据如下: 每...

    javascript二维数组和对象的深拷贝与浅拷贝实例分析

    本文实例讲述了javascript二维数组和对象的深拷贝与浅拷贝。分享给大家供大家参考,具体如下: 这篇文章主要为大家详细介绍了js实现数组和对象的深浅拷贝, 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新...

    oracle 存储过程和触发器复制数据

    创建程序包,并在程序中创建存储过程 create or replace PACKAGE NCS_ICP_TJ AS /*lfx@ncs-cyber.com.cn*/ /* TODO 在此输入程序包声明 (类型, 异常错误, 方法等) */ /*根据备案主体ID拷贝通过表备案数据到备案临时...

    PB数据窗口source介绍及举例

    可以整行复制粘贴,并命名为header[1],header[2],这样可以让数据窗口有多个header 4.table()行 这里全是定义的数据属性,是setitem,update,object.data等方法访问的根源 如果存在table()里的column,数据窗口里可以不...

Global site tag (gtag.js) - Google Analytics