一、浅克隆
1、基本数据类型的克隆(赋值即可)
var a = 1; var b = a; console.info(a); //1 console.info(b); //1 a = 2; console.info(a); //2 console.info(b); //1
把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。
2、数组克隆
如果我们采取基本数据类型的方式(赋值)来进行克隆,案例如下:
var arr1 = [1, 2, 3]; var arr2 = arr1; console.info(arr1); //1,2,3 console.info(arr2); //1,2,3 arr1.push(4); console.info(arr1); //1,2,3,4 console.info(arr2); //1,2,3,4
因为arr2引用了arr1,他们指向了内存中的同一块地址,所以arr1的改变也会导致arr2的改变!那如果要实现数组的浅克隆要怎么操作呢?
我们利用的数组的slice方法进行了克隆,代码如下:
var arr1 = [1, 2, 3]; var arr2 = arr1.slice(); console.info(arr1); //1,2,3 console.info(arr2); //1,2,3 arr1.push(4); console.info(arr1); //1,2,3,4 console.info(arr2); //1,2,3
二、深度克隆
function clone(obj) { var o, i, j, k; if (typeof(obj) != "object" || obj === null) { return obj; } if (obj instanceof(Array)) { o = []; i = 0; j = obj.length; for (; i < j; i++) { if (typeof(obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } else { o = {}; for (i in obj) { if (typeof(obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } return o; }