1. Object.assign
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
// Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。let target = { a: 1 }let object1 = { b: 2 }let object2 = { c: 3 }Object.assign(target, object1, object2)console.log(target); // { a: 1,b: 2,c: 3 }
2. 扩展运算符…
// 使用扩展运算符,当扩展运算符在第一层的时候实现的是深拷贝,多层对象时实现的是浅拷贝let obj1 = { a: 1, b: { c: 1 } }let obj2 = { ...obj1 };obj1.a = 2;console.log(obj1); //{a:2,b:{c:1}}console.log(obj2); //{a:1,b:{c:1}}obj1.b.c = 2;console.log(obj1); //{a:2,b:{c:2}}console.log(obj2); //{a:1,b:{c:2}}
3. 数组的方法实现深浅拷贝
let arr = [1, 2, 3, [2], 4];console.log(arr.concat()); // [1,2,3,4]console.log(arr.concat() === arr); //false
4. 手写一个浅拷贝
// 手写一个浅拷贝function shallowCopy(obj) {if (!obj || typeof obj !== "object") return;let newObject = Array.isArray(obj) ? [] : {}for (let key in obj) {if (obj.hasOwnProperty(key)) { // 循环,也会循环原型链上的属性,所以这里需要判断一下newObject[key] = obj[key]}}return newObject}let data = {name: 'zs',age: 20,main: {a: 1,b: 2}}//由于name是基本数据类型,会开辟一个新的地址来储存我们拷贝的内容,所以原数据的name属性不会被修改//main是引用类型,浅拷贝会直接拷贝它的地址,所以原数据的这个值也会改变let obj1 = shallowCopy(data)console.log(obj1);obj1.name = 'ls'console.log(obj1);obj1.main.a = 3console.log(obj1);
