一、对象和数组的拷贝
1.concat()
var arr1={'1','2','3'};
var arr2 = arr1.concat();
虽然返回的数组是新的数组,但是如果数组元素是对象时,两个数组的对象仍然是同一个引用,修改对象会影响到两个数组。
2.extend方法实现拷贝
var arr2 = $.extend([],arr1);
如果拷贝对象是数组,那么效果与concat一样;如果拷贝对象是Object【使用:$.extend({},objSrc)】,那么拷贝后的对象和原对象也不是同一个指向,互相之间也不影响。
3.深拷贝方法
var arr2 = $.extend(true,[],arr1);
拷贝后的数组的元素和原数组的元素不指向同一个对象,是两个完全分离的数组,互相不影响。
结论:
对象拷贝合适的方法是$.extend({},object);
数组拷贝合适的方法是$.extend(true,[],arrSrc);
示例:
1 //1.concat
2 var arrSrc = [
3 {
4 name:"test1",
5 age:40
6 },
7 {
8 name:"test2",
9 age:30
10 }
11 ];
12 var arrTarget = arrSrc.concat();
13 console.log(arrTarget);//此时元素1尚未改变(当然,在控制台打出的Log里元素1是改变了的,因为随后arrTarget就随着改变了。)数组仍是两个元素
14 arrSrc[0].type="changed";
15 arrSrc[2] = {
16 name:"test3",
17 age:30
18 };
19 console.log(arrSrc);//元素1改变,并且数组新增一个元素。
20 console.log(arrTarget);//元素1改变,但是数组仍是两个元素
21
22 //2.extend({},object) 效果与concat一样,只是concat是针对数组的操作,而extend是针对所有的Object操作。
23 // 如果一个对象要进行拷贝,可以用这种方法,这样拷贝后的对象和原来的对象就不是一个指向了。
24 var arrSrc2 = [
25 {
26 name:"test1",
27 age:40
28 },
29 {
30 name:"test2",
31 age:30
32 }
33 ]
34
35 var arrTarget2 = $.extend([],arrSrc2);
36 console.log(arrTarget2);
37 arrSrc2[0].name = "changed";
38 arrSrc2[2] ={
39 name:"test3",
40 age:30
41 }
42 console.log(arrSrc2);
43 console.log(arrTarget2);
44
45 // 3.extend(true,{},object) 深度拷贝,如果数组的元素是一个对象,拷贝后的数组的元素和原数组的元素不指向同一个对象,是两个完全分离的数组,互相不影响。
46 var arrSrc3 = [
47 {
48 name:"test1",
49 age:40
50 },
51 {
52 name:"test2",
53 age:30
54 }
55 ]
56
57 var arrTarget3 = $.extend(true,[],arrSrc3);
58 console.log(arrTarget3);
59 arrSrc3[0].name = "changed";
60 arrSrc3[2] ={
61 name:"test3",
62 age:30
63 }
64 console.log(arrSrc3);
65 console.log(arrTarget3);
数组拷贝
二、数组合并
1、concat
可以完整的合并两个数组,返回新数组,但是如果数组的元素是一个对象,那么合并后的数组的对象和原来的数组的对象仍是同一个指向,修改对象会影响两个数组。
数组各自增减元素是独立的,不影响的。
2、extend(false,[],arr1,arr2)
合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。
注意:合并后的数组相同位置的元素会被覆盖。
3.extend(true,[],arr1,arr2)
合并后的数组是一个新数组,三个数组的元素不指向同一个对象,是三个完全分离的数组,互相不影响。
注意:合并后的数组相同的元素也会合并。
结论:
数组合并方法只有concat可用。
为了数组元素之间互不影响,可以先concat,再把合并后的数组进行拷贝。(未经测试)
示例:
1 //1.concat 合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。
2 var arrSrc41 = [
3 {
4 name:"test1",
5 age:40
6 },
7 {
8 name:"test2",
9 age:30
10 }
11 ];
12 var arrSrc42 = [
13 {
14 name:"test99",
15 age:40
16 }
17 ]
18
19 var newArr = arrSrc41.concat(arrSrc42);
20 console.log(arrSrc41);
21 console.log(arrSrc42);
22 console.log(newArr);
23 arrSrc41[0].name = "changed";//第一个数组的名字修改,影响newArr
24 arrSrc42[0].name = "test88";//第二个数组的名字修改,影响newArr
25 arrSrc41[2] ={
26 name:"test3",
27 age:30
28 }//第一个数组新增元素,不影响newArr
29 newArr[2].age = 99; //新数组第三个元素的年龄修改,影响arrSrc42
30 console.log(arrSrc41);
31 console.log(arrSrc42);
32 console.log(newArr);
33
34
35 //2.extend(false,[],arrSrc51,arrSrc52) 合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。
36 //注意:合并后的数组相同的元素会被覆盖。所以合并后的数组长度为2,而不是3.第一个数组的第一个元素被第二个数组的第一个元素覆盖。
37 var arrSrc51 = [
38 {
39 name:"test1",
40 age:40,
41 city:"QD"
42 },
43 {
44 name:"test2",
45 age:30
46 }
47 ];
48 var arrSrc52 = [
49 {
50 name:"test99",
51 age:40,
52 country:"China"
53 }
54 ]
55
56 var newArr2 = $.extend(false,[],arrSrc51,arrSrc52)
57 console.log(arrSrc51);
58 console.log(arrSrc52);
59 console.log(newArr2);
60 arrSrc51[0].name = "changed";//第一个数组的名字修改,影响newArr2
61 arrSrc52[0].name = "test88";//第二个数组的名字修改,影响newArr2
62 arrSrc51[2] ={
63 name:"test3",
64 age:30
65 }//第一个数组新增元素,不影响newArr2
66 newArr2[0].age = 99; //新数组第一个元素的年龄修改,影响第二个数组的第一个元素(因为第二个数组的第一个元素把第一个数组的第一个元素覆盖了)
67 console.log(arrSrc51);
68 console.log(arrSrc52);
69 console.log(newArr2);
70
71 //3.extend(true,[],arrSrc51,arrSrc52) 合并后的数组是一个新数组,三个数组的元素不指向同一个对象,是三个完全分离的数组,互相不影响。
72 //注意:合并后的数组相同的元素也会合并。所以合并后的数组长度为2,而不是3.第一个数组的第一个元素和第二个数组的第一个元素合并。
73 var arrSrc61 = [
74 {
75 name:"test1",
76 age:40,
77 city:"QD"
78 },
79 {
80 name:"test2",
81 age:30
82 }
83 ];
84 var arrSrc62 = [
85 {
86 name:"test99",
87 age:40,
88 country:"China"
89 }
90 ]
91
92 var newArr3 = $.extend(true,[],arrSrc61,arrSrc62)
93 console.log(arrSrc61);
94 console.log(arrSrc62);
95 console.log(newArr3);
96 arrSrc61[0].name = "changed";//第一个数组的名字修改,不影响newArr2
97 arrSrc62[0].name = "test88";//第二个数组的名字修改,不影响newArr2
98 arrSrc61[2] ={
99 name:"test3",
100 age:30
101 }//第一个数组新增元素,不影响newArr2
102 newArr3[0].age = 99; //新数组第一个元素的年龄修改,不影响
103 console.log(arrSrc61);
104 console.log(arrSrc62);
105 console.log(newArr3);
数组合并