深拷贝与浅拷贝
- 参考地址:深浅拷贝
- 什么是浅拷贝与深拷贝?
- 浅拷贝:就是拷贝对象的引用,而不深层次的拷贝对象的值,多个对象指向堆内存中的同一对象,任何一个修改都会是使得所有对象的值被修改,因为它们公用一条数据;
- 深拷贝不会拷贝引用类型的引用,拷贝的是引用类型的值,形成一个新的引用类型。
- 实现深拷贝的几种方法。
- 使用递归的方式实现深拷贝
//使用递归的方式实现数组、对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 var objClone = Array.isArray(obj) ? [] : {}; //进行深拷贝的不能为空,并且是对象或者是 if (obj && typeof obj === "object") { for (key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepClone1(obj[key]); } else { objClone[key] = obj[key]; } } } } return objClone; }
- 通过 JSON 对象实现深拷贝(无法实现对对象中方法的深拷贝)
//通过js的内置对象JSON来进行数组对象的深拷贝 function deepClone2(obj) { var _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone; }
- 通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);
- Object.assign()拷贝
- 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
const obj = { a: 1 }; const copy = Object.assign({}, obj); console.log(copy); // { a: 1 }
- lodash函数库实现深拷贝
import cloneDeep from 'lodash/cloneDeep'; const test1 = { name: 'xx', age: 11 }; const test2 = cloneDeep(test1); const test3 = test1; console.log('test12 :>> ', test1 === test2); // false console.log('test13 :>> ', test1 === test3); // true
- 什么是浅拷贝与深拷贝?