{ 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 方法 解决办法就是递归