浅拷贝和深拷贝的区别
浅拷贝:浅拷贝是指创建一个新对象,新对象的属性值与原对象的属性值相同,都指向同一内存地址,如果新对象发生变化,原对象也会发生变化。
深拷贝:深拷贝是创建一个新对象,新对象会拷贝原对象的所以数据,新对象发生变化时原对象不会发生改变。
浅拷贝
浅拷贝可以通过Object.assign来实现
const obj = {} //创建一个新对象obj const objSort{ //原对象 name:'张三', value:{ age:18 } }; Object.assign(obj,objSort); //第一项是接收数据的对象,第二项为copy的对象 console.log(obj);
深拷贝
深拷贝此方法利用递归实现深拷贝
var obj={ //原数据 name:'张三', value:{ age:18, phone:13726378291 }, fn:function(){ }, nabs:[1,2,3,[22,33]] } function copy(obj){ //定义一个变量用来存储copy的数据 const newobj=null; //判断对象是否为复杂数据类型,如果是就调用自己然后继续循环,如果不是,直接赋值 if(typeof(obj)=='object' && obj !== 'null'){ //了解instanceof是干什么用的 //它是一种检验数据类型的方法 //instanceof它是检查一个对象是否数据某个类或者构造函数,如,obj.instanceof===Array,可以检查obj是否为Aray类型。 //所以这行的意思就是通过定义了一个存储拷贝过来的值,然后通过不同的,根据参数的具体数据类型然后声明不同的类型然后存储 newobj = obj instanceof Array? [] : {}; //循环obj 中的每一项,查看obj中是否还有复杂数据类型,如果里面还有复杂数据类型,就直接利用递归再次调用copy函数 for(var i in obj){ newobj[i] = copy(obj[i]) } }else{ newobj=obj } //注意函数必须要是返回值,不然会出现undefined return newobj } var obj2 = copy(obj) obj2.name = 'ok' obj2.value.age = 20 console.log(obj,obj2)
上述代码就是JavaScript中的深浅拷贝。