日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于深拷贝和浅拷贝

發布時間:2025/7/14 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于深拷贝和浅拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.淺拷貝

JavaScript存儲對象都是存地址的,所以淺復制會導致 a 和 b 指向同一塊內存地址

數組的賦值其實相當于給了索引,改變其中一個變量其他引用都會改變

  • var?a?=?[1,2,3];??
  • var?b?=?a;??
  • b[0]?=?4;??
  • //a為4?2?3??
  • //b為4?2?3??
  • var a = [1,2,3]; var b = a; b[0] = 4; //a為4 2 3 //b為4 2 3

    ?

    根據上面存儲對象的問題,這里就可以解決另一個問題:

    ? ??原始參數(比如一個具體的數字)被作為值傳遞給函數;值被傳遞給函數,如果被調用函數改變了這個參數的值,這樣的改變不會影響到全局或調用函數。

    ? ? 你傳遞一個對象(在js里數組不是簡單數據類型,而是對象)到一個函數,如果在函數里面改變了這個參數的內容,在外部這個變化是可見的。

    ?

    2.深拷貝

    ?

    (1)slice 函數

    (2)concat 函數

    (3)assgin

    ?

    三個函數的原理都是返回數組的一個副本(相當于另外開辟內存空間),所以并不會改變數組本身的的值

    ?

    但是這里有一點不同,就是assgin與其他兩點的不同

    雖然說assgin也是深拷貝,但是他只是第一層深拷貝,第二層之后還是進行淺拷貝,例子如下:

  • var?a?=?{??
  • ????a1:{??
  • ????????aa1:'11',??
  • ????????aa2:'22'??
  • ????}??
  • }??
  • var?b?=?object.assgin({},a);??
  • var?c?=?object.assgin({},a);??
  • b.a1.aa1?=?33;??
  • /*??
  • b:{??
  • ????a1:{??
  • ????????aa1:'33',??
  • ????????aa2:'22'??
  • ????}??
  • }??
  • c:{??
  • ????a1:{??
  • ????????aa1:'33',??
  • ????????aa2:'22'??
  • ????}??
  • }??
  • */??
  • var a = {a1:{aa1:'11',aa2:'22'} } var b = object.assgin({},a); var c = object.assgin({},a); b.a1.aa1 = 33; /* b:{a1:{aa1:'33',aa2:'22'} } c:{a1:{aa1:'33',aa2:'22'} } */

    ?

    轉載于:https://www.cnblogs.com/mei123/p/8548772.html

    總結

    以上是生活随笔為你收集整理的关于深拷贝和浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。