数组和对象的复制

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]}
 

 

posted @ 2016-10-19 11:50  尹丹  阅读(219)  评论(0编辑  收藏  举报