- 浅拷贝的概念:浅拷贝只是拷贝一层,更深层次的对象级别的只拷贝引用地址,
- 深拷贝的概念:深拷贝会拷贝多层,每一级的数据都会拷贝
- 弊端
浅拷贝:我们会发现通过浅拷贝更深层次的引用类型,如果修改 b.googs,最终 obj.goods 也会跟着修改,是因为在拷贝的时候,我们只是将引用地址拷贝给了 b.goods,也就是说 b.goods 和 ob.goodsj 引用的是同一个对象
-
浅拷贝
var obj = { id: 1, name: "章三", msg: { age: 18, }, }; var o = {}; // 方式一:const key in obj for (const key in obj) { o[key] = obj[key]; } // 方式二:Object.assign() // 建议使用 Es6 中新增的 Object.assign() 方法实现浅拷贝 Object.assign(o, obj); obj.msg.age = 20; console.log(obj); console.log(o); // 方法三:...obj const obj = { a: 1, goods: { name: '鞋', price: 199 } } const b = { ...obj } -
深拷贝
//方法一 //被拷贝的数组oldobj //拷贝的数组newobj function deepCopy(newobj, oldobj) { for (const key in oldobj) { // 获取对象中的属性 var item = oldobj[key]; if (item instanceof Array) { // 判断是否为数组 newobj[key] = []; deepCopy(newobj[key], item); } else if (item instanceof Object) { // 判断是否为对象 newobj[key] = {}; deepCopy(newobj[key], item); } else { // 判断是否为普通值 newobj[key] = item; } } } deepCopy(o, obj); obj.msg.age = 20; console.log(obj); console.log(o); //方法二 var obj = { name: "zs", age: 20, father: [2, 3, 4], }; function deepClone(target) { //这一行如果不用三元判断 如果是数组会有bug会被拷贝成伪数组对象 var tempObj = Array.isArray(target) ? [] : {}; for (var key in target) { if (typeof target[key] === "object") { tempObj[key] = deepClone(target[key]); } else { tempObj[key] = target[key]; } } return tempObj; } var obj1 = deepClone(obj); console.log(obj1);\