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=2obj.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_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: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=2obj.b[0]=12;console.log(obj);//{a:2,b:[12,2,3],c:8}console.log(obj_q);//{a:1,b:[1,2,3]}
时间: 2024-10-01 05:11:25