在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,事實證明如果只是簡單的將它賦予其他變量,那么我們只要更改其中的任何一個,然后其他的也會跟着改變,這就導致了問題的發生。
參考Object.assign():https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
<!DOCTYPE html> <html> <head> <title>測試深拷貝,淺拷貝方法及現象</title> </head> <body> <script type="text/javascript"> //Object.assign()方法是淺拷貝 var myobject={ a:"a", b:"b", c:"c", } var newobject=Object.assign({},myobject); newobject.a=222; document.writeln("原始:"+JSON.stringify(myobject)); document.writeln("現在:"+JSON.stringify(newobject)); function test() { 'use strict'; let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj1.a = 1; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj2.a = 2; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} obj2.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}} // Deep Clone //利用json方法是深復制,但要JSON安全 obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}} } test(); </script> <!-- <script type="text/javascript"> //這是淺拷貝,該變拷貝的對象會改變原始對象的值 var arr = ["One","Two","Three"]; var arrto = arr; arrto[1] = "test"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,test,Three document.writeln("數組的新值:" + arrto + "<br />");//Export:數組的新值:One,test,Three </script> --> <!-- <script type="text/javascript"> //這是深拷貝,該變現有對象不會改變原始對象的值 var arr = ["One","Two","Three"]; var arrtoo = arr.slice(0); arrtoo[1] = "set Map"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three document.writeln("數組的新值:" + arrtoo + "<br />");//Export:數組的新值:One,set Map,Three </script> --> <!-- <script type="text/javascript"> //這是深拷貝 var arr = ["One","Two","Three"]; var arrtooo = arr.concat(); arrtooo[1] = "set Map To"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three document.writeln("數組的新值:" + arrtooo + "<br />");//Export:數組的新值:One,set Map To,Three </script> --> <!-- <script type="text/javascript"> //深拷貝,json方法是深拷貝 var someobj={ a:"a", b:"b", c:"c" } var newobject=JSON.parse(JSON.stringify(someobj)); someobj.a="aaaa"; document.writeln("原始:"+JSON.stringify(someobj)+"<br/>"); document.writeln("現在:"+JSON.stringify(newobject)+"<br/>"); //原始:{"a":"aaaa","b":"b","c":"c"} // 現在:{"a":"a","b":"b","c":"c"} </script> --> </body> </html>
這里只是淺嘗輒止,以后還會繼續探究。
總結:淺拷貝Object.assign(),
深拷貝用JSON.parse(JSON.stringify(someobj));(缺點:只能拷貝純json的,不能拷貝包含函數的對象)
但要保證someobj是json安全的,符合json規則。
淺拷貝的影響,要用深拷貝的地方:如一個表格,點擊一行進行編輯,當彈出框中input輸入框值變化,表格數據也會跟着變化。事實上,我們要的是,只有提交了,重新刷新,表格這個數據才會變化。