深入认识深拷贝 浅拷贝
公共方法
export function copy (obj) {
var newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){
return;
}
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i];
}
return newobj
}
// 深拷贝 浅拷贝 对于基本类型来说 对于赋值操作 就是 深拷贝 因为值 不是复杂类型 没有相关的惯量指针地址 所以 可能在 复制 时 一次赋值 能将全部的基本类型所有 都给复制过来 两者之间 实现深拷贝 、
// 在我的概念里面 深拷贝 更多的是 经过复制操作之后 两者之间 没有更多的 关联性 相对独立 两者不会互相影响
// 浅拷贝 最主要的理解 俗语 藕断丝连 之所以称之为浅拷贝 就是很浅的层面 拷贝一个复杂的对象或数组等的组合 也只是 只能复制到 最外层的 对象 形式 内部的额深层的数据拷贝 并没有 很好的复制过来 进而
// 也就是因为 内存内部的存储原理 复杂类型 如 数组 对象等形式的 数据 在赋值操作 比如 = 时 let list = netLists 当前的两个变量 都代表 对象形式 怎么就能确定他真的时 深拷贝了所有数据
// 但是 因为 内存结构 一个对象 在声明以后 计算机 就会自动将 对象 的地址 存储到 栈内存中 然后他的内部数据形式 全存在 HEAp 中
// 赋值操作 只会 给 当前变量 一个 当前赋值对象的 一个地址 当前地址 就是 这个 栈内存中的对象地址 其实也算是 已经 拿到这个对象 可以像平常一样 输出其中对象的属性 及值 但是需要搞清楚的一点
// 他只是一个地址 所有的对象赋值 都要想到这一点 就因为 拿到的是一个对象的地址 虽然可以 获取到其中的属性或值 如果之后的操作 只是想 取值get 当然没什么问题 奴会造成 任何失误 或者bug
// 但是如果 当你 将拿过来的对象 进行二次赋值 操作 后 之后被赋值的变量 只会 拿到这个 对象的 地址
// 如果 如果 当前操作 为 一个对象 我们知道这个对象 赋值操作 时 并没有直接的能复制给 另一个变量 采取了用 深拷贝的方式 解决 然后将 所有的 对象 完整的 拷贝给list 然后遵循 其中的法则 由将一个全新的对象 复制给了 两个不同名称的变量
// 现在的形式 就是 两个变量 aa bb 同事有相同的地址 客观讲 其实是相等的 但是 我们知道 两个单独声明的对象 并不会相等 除非 有aa = bb 大概这种形式下 两者会因为 都指向一样的地址 然后被认为是相等的
// 前面说到 两者之间因为 一个对象 分别 复制给 aa bb 现在的 aa bb 如果要被使用的时候 那么 能正常使用的也就是 能get 获取对象的值 因为他们只是去进行了复制 入宫一个对象 因为一个地址 改变其中的 内容后 那么这个对象中的所改变的属性的值 会得到修改
// 并且 产生连锁反应 所有 被这个对象 赋值 的所有操作 因为与之关联 所以 只要哪一个 变动了这个关联的 对象 那么其他 关联的变量 还有 他自身的的一些取值 也就变掉 这也就是与我们需求相悖
// 往往 我们只是想 去 将所有的值 作为一个 单独的对象 获取 并重新去操作 而不是希望 改变他 把其他的 值也变了 这个需求还是比较广泛去用到 特别提醒 就是在对对象 进行赋值 时 看看需不需要 单纯的获取 还是 单独去操作其中的 值
//
网友评论