zoukankan      html  css  js  c++  java
  • 数组的深复制和浅复制

    ================数组的浅复制:slice(或concat)================
    
    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]
    
    //①使用slice方法生成foo的浅复制,赋值给bar
    var bar:Array=foo.slice();//也可以用:foo.concat()
    //②比较foo和bar
    trace(bar);
    //输出浅复制bar的内容:a string element,1,2,3,[object object],果然和foo完全一样
    trace(foo==bar);
    //输出:false
    //因为对于Array这个引用类型,“==”判断的是变量持有对象的引用是否相同,而不是内容相同,由于bar是slice方法返回的一个新数组,因此肯定不和foo变量原有的数组引用相同。
    trace(foo[0]==bar[0]);
    //输出:true
    //注意,第一个元素是值类型,因此“==”是根据值(value)来判断的
    trace(foo[1]==bar[1]);//输出:true
    trace(foo[2]==bar[2]);//输出:true
    //这两个元素是引用类型,“==”是根据引用是否相同来判断的。
    
    //③下面我们来挨个改变bar数组的所有元素,再来比较一下foo和bar
    bar[0]="a new string in bar";
    bar[1][0]=1000;
    bar[2].web="www.ActionScript3.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
    
    ================数组的深复制:ByteArray的运用================
    
    var objectElement:Object={name:"kingda",web:"www.kingda.org"};
    var arrayElement:Array=[1,2,3];
    
    //①以下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]
    
    //②比较foo和bar
    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的元素,再看foo是否受到影响
    bar[0]="a new string in bar";
    bar[1][0]=1000;
    bar[2].web="www.ActionScript3.cn";
    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.kingda.org
    trace(bar[2].web);
    //输出:www.ActionScript3.cn
    //可以看出,bar的改变并没有影响到foo,确确实实把所有元素都复制了。
    
  • 相关阅读:
    本地文件上传到Linux服务器
    进阶线路
    process.env.NODE_ENV
    Docker 实践备忘录
    Sae配置Java数据库连接
    Java实现微信菜单json字符串拼接
    spring+hibernate+jpa+Druid的配置文件,spring整合Druid
    根据当前节点获取所有上层结构的组织(递归算法)
    实现左右两边用户添加、删除、调位置(上下移动)、排序等的功能
    Dom4j解析Xml文件,Dom4j创建Xml文件
  • 原文地址:https://www.cnblogs.com/leon3286/p/1704430.html
Copyright © 2011-2022 走看看