{ 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' } }string
{ grade: 1, name: { first: 'bob' } }console
{ 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 方法 解決辦法就是遞歸