深拷貝與淺拷貝js,方法


在使用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輸入框值變化,表格數據也會跟着變化。事實上,我們要的是,只有提交了,重新刷新,表格這個數據才會變化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM