zoukankan      html  css  js  c++  java
  • 数组和对象的复制

    1、数组的复制

    a)利用数组的concat()方法

    var a=[1,2,3];
    var b=a.concat();
    console.log(b);//[1,2,3]

    a[3]=5;
    console.log(a);//[1,2,3,5]
    console.log(b);//[1,2,3]

    b)利用数组的slice()方法

    var a=[1,2,3]
    var b=a.slice(0);
    console.log(b);//[1,2,3]

    a[3]=5;
    console.log(a);//[1,2,3,5]
    console.log(b);//[1,2,3]

    附:arrayObject.slice(start,end)的方法说明

    参数 描述
    start                               必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
    end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

     返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。不会改变原数组。

    c)利用jquery中的map方法

    var a=[1,2,3]
    var b=$.map(a,function(n){return n})
    console.log(b);//[1,2,3]
    a[3]=5;
    console.log(a);//[1,2,3,5]
    console.log(b);//[1,2,3]

    d)如果数组的元素中存在对象,那么需要深度复制

    //第二层为对象
    var
    a=[{one:1,two:2},{three:3}]
    var b=$map(a,function(obj){
      return $.extend(true,{},obj);//对象需要深度复制
    })

    //第二层为数组(需要以后补充)

    2、对象的复制

    a)利用jquery,对象的浅度复制(只复制顶层)

    var  obj={a:1,b:2,c:3}
    var obj_q=$.extend({},obj);
    
    console.log(obj_q);//{a:1,b:2,c:3}
    
    obj.a=45;
    console.log(obj);//{a:1,b:2,c:3}
    console.log(obj_q);//{a:45,b:2,c:3}

    b)利用jquery,对象的深度复制

    若仍然用浅度复制,结果如下:

    //第二层为对象
    var
    obj={a:1,b:{e:45},c:3} var obj_q=$.extend({},obj); console.log(obj_q);//{a:1,b:{e:50},c:3} 没错,此时obj_q.b.e已经变成了50
    obj.a=2; obj.b.e=50; console.log(obj);//{a:2,b:{e:50},c:3} console.log(obj_q);//{a:1,b:{e:50},c:3}


    //第二层为数组
    var obj={a:1,b:[1,2,3],c:8}
    var obj_q=$.extend({},obj);

    console.log(obj_q);//{a:1,b:[12,2,3],c:8}

    obj.a=2
    obj.b[0]=12;
    console.log(obj);//{a:2,b:[12,2,3],c:8}
    console.log(obj_q);//{a:1,b:[12,2,3]}

    深度复制如下:

    //第二层为对象
    var
    obj={a:1,b:{e:45},c:3} var obj_q=$.extend(ture,{},obj);//第一个参数为true,不要忘了 console.log(obj_q);//{a:1,b:{e:45},c:3} obj.a=2; obj.b.e=50; console.log(obj);//{a:2,b:{e:50},c:3} console.log(obj_q);//{a:1,b:{e:45},c:3}


    //第二层为数组
    var obj={a:1,b:[1,2,3],c:8}
    var obj_q=$.extend(true,{},obj);

    console.log(obj_q);//{a:1,b:[1,2,3],c:8}

    obj.a=2
    obj.b[0]=12;
    console.log(obj);//{a:2,b:[12,2,3],c:8}
    console.log(obj_q);//{a:1,b:[1,2,3]}
     
  • 相关阅读:
    n-1位数
    关于VC预定义常量_WIN32,WIN32,_WIN64
    python中的闭包
    TCP粘包, UDP丢包, nagle算法
    C++中 explicit的用法
    为什么mysql索引要使用B+树,而不是B树,红黑树
    屏障和屏障属性
    带有超时的读写锁
    pthread_mutex_timedlock
    段错误以及调试方式
  • 原文地址:https://www.cnblogs.com/yddlvo/p/5976699.html
Copyright © 2011-2022 走看看