// 1.使用 slice 或 contcat 方法实现简单复制,简单值不一起改变,但是引用类型则原来对象和复制对象一起改变 var arr1 = [1, 2, 3, 4], arr2 = arr1.slice(0), arr3 = arr1.concat(); console.log(arr1, arr2, arr3);//[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4], arr2[2] = 10; arr3[2] = 11; console.log(arr1, arr2, arr3);//[1, 2, 3, 4] [1, 2, 10, 4] [1, 2, 11, 4], // 但是引用类型则原来对象和复制对象一起改变 var fun = function(log) {console.log}, arr1 = [1, 2, [3, 4], {a: 5, b: 6}, fun], arr2 = arr1.slice(0), arr3 = arr1.concat(); console.log(arr1, arr2, arr3); arr1[0] = 10; arr2[3].a = 100; arr3[2][1] = 5; console.log(arr1, arr2, arr3);
// object.assign()
var obj = { a: 1 ,b:{d:1}};
var copy = Object.assign({}, obj); //浅拷贝
//因为 Object.assign()拷贝的是属性值。
//假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。
//也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;
//如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的。
console.log(copy); // { a: 1 }
copy.a=2;
copy.b.d=2
console.log('obj',obj);
console.log('copy',copy);
// 1.0深度复制(1.使用jq的$.extend(true,target,obj)) var arr1 = [1, 2, [3, 4], {a: 5, b: 6}, 7], arr2 = $.extend(true, [], arr1); console.log('arr2',arr2); arr2[1]=10; console.log('arr2',arr1); console.log('arr2',arr2); // 2.0对象的深度复制newobj = Object.create(sourceObj) Object.prototype.clone = function() { var obj = {}; for(var i in this) { obj[i] = this[i]; } return obj; } // 3.0数组的深度复制 Array.prototype.clone = function() { var len = this.lenght, arr = []; for(var i = 0;i < len;i++) { if(typeof this[i] !== "object") { arr.push(this[i]); } else { arr.push(this[i].clone()); } } return arr; } // 2.0深度复制newObj = JSON.parse(JSON.stringify(sourceObj)); var arr1 = [1, 2, [3, 4], {a: 5, b: 6}, 7], arr2 = JSON.parse(JSON.stringify(arr1)); console.log(arr1, arr2);//[1, 2, [3, 4], {a: 5, b: 6}, 7] [1, 2, [3, 4], {a: 5, b: 6}, 7], arr2[1] = 10; arr2[3].a = 20; console.log(arr1[1], arr2[1]);//2 10 console.log(arr1[3], arr2[3]);//{a: 5, b: 6} {a:20,b:6}