前述: 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));