天天看点

js对象之深浅拷贝

前述: js分为简单类型和复杂类型, (简单、复杂类型有哪些可自行google)

简单类型拷贝方式 可以直接用 =     :let a = 5; let b = a;

即可将 a 拷贝(复制)给 b, 并且,a、b 都有独立的内存,改变b的值也不会影响 a

而复杂类型(例如: 对象object );let a = {name: 'xx'}; let b = a;

复杂类型如果用简单的 = 进行拷贝,只是浅拷贝,

何为浅拷贝? 将 a 浅拷贝给 b,其实a , b 都指向同一个地址,a 只是将地址给了b一份。

  当指向了同一个地址时,修改 a 的值,b也会跟着改变,修改 b 的值,a也会跟着改变;

所以,复杂类型 的拷贝不能用简单的 = 来操作,

es6提供一个方法,

Object.assign(); 作用,将 b 拷贝给 a,改变 b 的值,a也不会改变,

object.assign的使用方法  : 

let obj1 = {name: 'xx', child:{age: 18}};

let obj2 = Object.assign({}, obj1);

但是,object.assign()只能拷贝一层,对象的层级深了,也没用,第二层以下的都是浅拷贝;child的值就是第二层

使用Object.assign方式只拷贝了对象的第一层, 第二层或之后都只拷贝了指针;修改obj2第二层,obj1还是会跟着改变

深拷贝的解决方案:

 // 深拷贝, 修改 obj2 或 obj1 任意的数据, obj1 或 obj2 都不会改变

  obj2 = JSON.parse(JSON.stringify(obj1));

继续阅读