js中的浅拷贝和深拷贝

1.概念

浅拷贝:是将一个对象的属性值复制到另一个对象,如果有的属性的值为引用类型的话,那么会将这个引用的地址复制给对象,因此,两个对象会有同一个引用类型的引用,浅拷贝可以使用object.assign和展开运算符(将一个数组转为用逗号分隔的参数序列--(...))来实现。

深拷贝:是将一个对象的属性值复制到另一个对象,如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此,对象获得一个新的引用类型而不是嘴个元祐类型的引用。深拷贝对于一些对象可以使用json的两个函数(stringify(),parse())来实现,但是由于json的对象格式化比js的对象格式化更加严格,所以如果属性值里边出现函数或者symbol类型的值时,会转化失败。

2.实现方式

浅拷贝:

1.Object.assign

const a = { a: 1 ,b:2};const b = { b: 4 };const c = { c: 3 };const obj = Object.assign({}, a, b, c);obj // {a:1, b:4, c:3}

2.for in 循环遍历

function easyCopy(object) { // 只拷贝对象 if (!object || typeof object !== "object") return; // 根据 object 的类型判断是新建一个数组还是对象 let newObject = Array.isArray(object) ? [] : {}; // 遍历 object,并且判断是 object 的属性才拷贝 for (let key in object) { if (object.hasOwnProperty(key)) { newObject[key] = object[key]; } } return newObject; }

深拷贝:

1.json

function deepClone(obj) { let tojson = JSON.stringify(obj);//将对象转换为json字符串形式 let result = JSON.parse(tojson);//将转换而来的字符串转换为原生js对象 return result;};let obj1 = { xiao: { age: 20, name: 111 }, zhang: { age: 21, name: 222 }};let test = deepClone(obj1);console.log(test);

2.for in 循环遍历

 function deepCopy(object) { if (!object || typeof object !== "object") return; let newObject = Array.isArray(object) ? [] : {}; for (let key in object) { if (object.hasOwnProperty(key)) { newObject[key] = typeof object[key] === "object" ? deepCopy(object[key]) : object[key]; } } return newObject; }

  

相关文章