复制一个数组,是指生成一个新的数组,内容和原有数组一样。数组赋值经常需要用到,比较重要。
有两种复制方式:浅复制和深复制。这个概念不是数组特有的。对引用类型的数据复制方式有有浅复制和深复制的区别。
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,确确实实把所有的元素都真正复制了
分享到:
相关推荐
浅复制与深复制只存在于引用数据类型当中 基本数据类型储存在栈内存当中 栈内存是一个萝卜一个坑 互不影响 引用数据类型储存在堆内存当中 堆内存是一片储存空间,引用数据类型存储在堆内存中的是一个内存地址 ,...
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光纤磁盘存储系统提供了直观易用的Snapshot功能,可以帮助用户实现在不中止应用数据的情况下进行...Snapshot功能搭配数据卷复制功能使用,可以提供更为广泛的数据应用,比如更深层次的应用测试以及数据挖掘等。
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 ...
浪潮新近推出了4Gb光纤磁盘存储系统AS1000G2,该浪潮自有高端光纤磁盘存储系统除了高品质的硬件设计之外,在管理软件中还配备了四个功能强大的数据应用功能:数据卷隔离映射功能、数据快照功能、数据复制功能和数据...
主要介绍了MySQL中表复制:create table like 与 create table as select,需要的朋友可以参考下
下面小编就为大家带来一篇浅谈JavaScript中面向对象的的深拷贝和浅拷贝。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。 1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。 ...
它使用了动态数据复制和分区技术来实现高可用, 高性能, 高可扩展性, 和容错. 另外, 对于一个分布式数据容器, Apache Geode 是一个基于内存的数据管理系统, 提供了可靠的异步事件通知和可靠的消息投递.Apache Geode ...
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 深度复制数据安装npm $ npm install deepcopy用法node.jsJavaScript const deepcopy = require ( 'deepcopy' ) ;打字稿import * as deepcopy from 'deepcopy' ;浏览器< script src =" deepcopy.min....
3 对于 C 语言及其它编译型语言,配套软件中提供可链接的模块文件 (OBJ 文件 ) , 模块文件中提供两个函数 :(1) 写数据 ; ⑵读数据。开发商可在要加密软件的源码中加入适当的调用语句,对软件狗进行读写操作,以确定...
复制表结构及其数据 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。 create table table_name_new as (select * from table_name_old); 只复制...
拉勾数据分析岗数据分析报告 简介:试着,做了⼀个拉勾⽹数据分析师职位的数据分析。 其实,虽然很想做数据分析师,但是是跨⾏,⼼⾥相当忐忑,做这个分析就相当于加深⾃⼰对数据分析这个⾏业的了解了。 ⼤致思路 ⼤...
因此对 JavaScript 中的复杂数据类型(object)来说,也会有浅拷贝和深拷贝的概念:浅拷贝指两个不同的变量存的是同一个对象的地址,即两个变量指向同一块内存区域;深拷贝则是重新分配了一块内
as使用的ByteArray类:compress 和 uncompress 方法。易语言对象载入flash,源码来自论坛网友分享的源码,需要写本地文件,有点麻烦!。尝试过用酷哥的支持库,内存加载swf字节集,经测试发现,CallFunction方法接收...
编写MR程序,让其可以适合大部分的HBase表数据导入到HBase表数据。其中包括可以设置版本数、可以设置输入表的列导入设置(选取其中某几列)、可以设置输出表的列导出设置(选取其中某几列)。 原始表test1数据如下: 每...
本文实例讲述了javascript二维数组和对象的深拷贝与浅拷贝。分享给大家供大家参考,具体如下: 这篇文章主要为大家详细介绍了js实现数组和对象的深浅拷贝, 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新...
创建程序包,并在程序中创建存储过程 create or replace PACKAGE NCS_ICP_TJ AS /*lfx@ncs-cyber.com.cn*/ /* TODO 在此输入程序包声明 (类型, 异常错误, 方法等) */ /*根据备案主体ID拷贝通过表备案数据到备案临时...
可以整行复制粘贴,并命名为header[1],header[2],这样可以让数据窗口有多个header 4.table()行 这里全是定义的数据属性,是setitem,update,object.data等方法访问的根源 如果存在table()里的column,数据窗口里可以不...