首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)
之外就是引用类型了,也可以说就是js对象了。
引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
在探讨到深度克隆之前,我们先来看一下下面的例子:
example01:
1 var a = [1,2,3]; 2 var b = a; // a b共用一个引用 3 b.push(4); 4 alert(b); // [1,2,3,4] 5 alert(a); // [1,2,3,4]
example02:
1 var a = [1,2,3]; 2 var b = a; 3 b = [1,2,3,4]; // b新开了一个引用 4 alert(b); // [1,2,3,4] 5 alert(a); // [1,2,3]
example03:
1 var obj = { 2 a: 10 3 }; 4 var obj2 = obj; 5 obj2.a = 20; 6 alert(obj.a); // 20
example04:
1 var obj = { 2 a: 10 3 }; 4 function copy(obj){ // 浅拷贝, 只拷贝的一层 5 var newObj = {}; 6 for(var attr in obj){ 7 newObj[attr] = obj[attr]; 8 } 9 return newObj; 10 } 11 var obj2 = copy(obj); 12 obj2.a = 20; 13 alert(obj.a); // 10
example05:
1 var obj = { 2 a: { 3 b: 10 4 } 5 } 6 function copy(obj){ //浅拷贝, 只拷贝了一层 7 var newObj = {}; 8 for(var attr in obj){ 9 newObj[attr] = obj[attr]; 10 } 11 return newObj; 12 } 13 var obj2 = copy(obj); 14 obj2.a.b = 20; 15 alert(obj.a.b); // 20
看完上面几个例子之后,想必对js对象引用有了一定的认识。接下来,我们来看js里面另外一个重要的应用---递归。
递归定义可以分为两点:(1).函数调用函数自身,执行递的动作;(2).最后一次判断一个终止条件,可以执行归的动作。
example06:
1 //求nX(n-1)X(n-2)X...X2X1 2 3 function test(n){ 4 if(n == 1){ 5 return 1; 6 } 7 return n*test(n-1); 8 } 9 alert(test(5)); // 120
所以,深拷贝也用到了递归。
对象的子对象也是引用,所以遍历赋值的时候要判断,子元素是否是对象,如果子元素是对象,则继续对子元素进行遍历赋值。
example07:
1 //深拷贝 2 function deepClone(obj){ 3 var newObj = {}; 4 if(typeof obj != ‘object‘){ 5 return obj; 6 } 7 for(var attr in obj){ 8 newObj[attr] = deepClone(obj[attr]); 9 } 10 return newObj; 11 } 12 var obj = { 13 a: { 14 b: 10 15 } 16 }; 17 var obj2 = deepClone(obj); 18 obj2.a.b = 20; 19 alert(obj.a.b); // 10
时间: 2024-10-15 09:27:03