打印结果:
- {age: 10, grade: 1, name: { first: bob} }
- { grade: 1, name: { first: bob } }
- { grade: 1, name: { first: bob } }
- { grade: 9, name: { first: chris } }
- { age: 10, grade: 1, name: { first: chris } }
- { grade: 1, name: { first: bob } }
- { grade: 1, name: { first: chris } }
结论: 由于对象创建在堆上 栈上的变量保存其地址 所以也叫指针变量
浅拷贝 如 let simpleObj = obj;
则只拷贝了 obj 在栈上的指针变量给 simpleObj 也就是说 simpleObj 实际存储的值是 obj 的对象的内存地址 指向与 obj 同样的堆内存地址 所以改变 obj 的值 simpleObj 的值也会改变
深拷贝 就是 copy 了一份对象 放在另一块堆内存地址 改变之前的对象 对这个复制的对象不会有任何影响
js 里有几种深拷贝方式
Object.assign() 不算深拷贝 也不算浅拷贝 一级拷贝 如果内层还有引用类型 就是浅拷贝了
... 扩展和 assign 一样
JSON.parse(JSON.Stringify()) 深拷贝 但是缺点是不能拷贝 constructor 方法 解决办法就是递归
来源: http://www.bubuko.com/infodetail-2535451.html