js的深拷贝和浅拷贝

127 阅读1分钟

一、浅拷贝

1、通过for in遍历实现

var obj = { name: "水电费", sex: "男", hobby: ["就是繁花似锦", "涟漪"] };
var obj1 = {};
for (let k in obj) { 
  obj1[k] = obj[k] 
}
console.log(obj1)

输出如下

obj1.hobby[0]="简单的"
console.log(obj)

输出如下 改变obj1的引用类型会改变原来的值

obj1.name="我的值"
console.log(obj)

改变obj1的原始类型不会改变obj原来的值

2、通过object.assign方法实现

var obj = { name: "水电费", sex: "男", hobby: ["就是繁花似锦", "涟漪"] };
var obj2 = Object.assign({}, obj);
console.log(obj2);

输出如下:

同样的我们分别改变obj2的原始类型和引用类型

 obj2.name="程序员"; //原始类型
obj2.hobby[1]="学习"; //引用类型
console.log(obj2);
console.log(obj);

二、深拷贝

1、通过循环遍历

var obj ={
    name:"嘻嘻",
    age:"25",
    alip:["学会", "程序", "css"]
};
function fn(obj){
    var newObj = obj instanceof Array ? [] : {}
    for(let k in obj){
        newObj[k] = typeof obj[k] === "object" ? fn(obj[k]) : obj[k];
    }
    newObj.name="心塞";
    newObj.alip=["学会1",  "程序", "css"];
    return newObj;
}

不会改变原先的任何数据

2、先用JSON.stringify方法把对象转换为字符串

在用JSON.parse()方法把字符串转为对象

var obj = {
      name: "嘻嘻",
      age:"25",
      alip: ["学会", "程序", "css"]
    }
 var obj1 = JSON.stringify(obj);
 var obj2 = JSON.parse(obj1);
 console.log(obj);
 console.log(obj2);

输出如下:

下面我们试着改变obj2.name

obj2.name="我变化了";

输出如下:

原始的obj没有改变