<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          js中深拷貝和淺拷貝的區別及原理

          時間:?2017-11-29閱讀:?1228標簽:?拷貝

          javascript的深拷貝和淺拷貝主要是針對像Object, Array這樣的復雜對象的,簡單理解為淺拷貝只復制一層對象的屬性,而深拷貝則遞歸復制了所有層級。  

          下面是一個簡單的淺拷貝實現: 

          <script>
          var obj = {
              name : 'tony',
              infor:[1,2],
          };
          var obj1 = {};
          for (var i in obj) {
              obj1[i] = obj[i];
          }
          
          console.log(obj); //Object {name: "tony", infor: Array[2]}
          obj1['infor'].push(3);
          console.log(obj); //Object {name: "tony", infor: Array[3]}
          console.log(obj1); //Object {name: "tony", infor: Array[3]}
          console.log(obj1['infor']);//[1, 2, 3]
          console.log(obj['infor']);//[1, 2, 3]
          console.log(obj['infor'] === obj1['infor']);//true
          </script>

          從輸出我們可以看出,當我們在obj1中的infor添加屬性,取發現在obj中同樣添加了。這就是因為淺拷貝對于屬性是對象的時候,只是進行簡單的地址拷貝,其引用關系也在;淺拷貝只有當單獨修改第一層對屬性的時候才不會相互修改,如:

          obj1.name="haha"
          console.log(obj1.name);//輸出haha
          console.log(obj);//輸出tony


          在來看下深拷貝的實現:

          <script>
          function inCopy(obj1,obj2){
              var obj1 = obj1 || {};
              for (var i in obj2) { 
                  if(obj2.hasOwnProperty(i)){ //只拷貝實例屬性,不進行原型的拷貝
                      if(typeof obj2[i] == 'object') { //引用類型的數據單獨處理
                          obj1[i] = Array.isArray(obj2[i])?[]:{};
                          inCopy(obj1[i],obj2[i]); //遞歸處理引用類型數據
                      }else{
                          obj1[i] = obj2[i]; //值類型的數據直接進行拷貝
                      }
                  }
              }
          }
          var obj = {
              name : 'tony',
              infor:[1,2],
          };
          var obj1 = {};
          inCopy(obj1,obj);//深拷貝
          
          console.log(obj); //Object {name: "tony", infor: Array[2]}
          obj1['infor'].push(3);
          console.log(obj); //Object {name: "tony", infor: Array[2]}
          console.log(obj1); //Object {name: "tony", infor: Array[3]}
          console.log(obj1['infor']);//[1, 2, 3]
          console.log(obj['infor']);//[1, 2]
          </script>


          可以看出深拷貝對兩者之間的改變是互不影響的,它不僅將原對象的各個屬性逐個復制出去,而且將原對象各個屬性所包含的對象也依次采用深復制的方法遞歸復制到新對象上。這就不會存在上面 obj 和 obj1 的 infor屬性指向同一個對象的問題。


          值得注意的是如果對象比較大,層級也比較多,深拷貝會帶來性能上的問題。在遇到需要采用深拷貝的場景時,可以考慮有沒有其他替代的方案。在實際的應用場景中,也是淺拷貝更為常用。  


          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/194

          JS變量存儲與深拷貝和淺拷貝

          string、number、null、undefined、boolean、symbol(ES6新增) 變量值存放在棧內存中,可直接訪問和修改變量的值 基本數據類型不存在拷貝,好比如說你無法修改數值1的值

          Js如何禁止復制粘貼?

          JavaScript中可以使用oncopy事件來禁止復制,oncopy事件在用戶拷貝元素上的內容時觸發。使用onpaste事件禁止粘貼,onpaste事件在用戶向元素中粘貼文本時觸發。

          14個JS數組拷貝技巧

          數組拷貝經常被誤解,但這并不是因為拷貝過程本身,而是因為缺乏對 JS 如何處理數組及其元素的理解。JS 中的數組是可變的,這說明在創建數組之后還可以修改數組的內容。這意味著要拷貝一個數組,咱們不能簡單地將舊數組分配給一個新變量

          Js實現深淺復制

          JavaScript中有兩種數據類型,基本數據類型如undefined、null、boolean、number、string,另一類是Object。簡單數據類型只存儲在內存中的棧區,復制的時候是值傳遞給新的索引。而復雜數據類型由棧區和堆區共同儲存

          js的淺拷貝 VS 深拷貝

          我們常常會用到拷貝對象的功能,而拷貝有淺拷貝和深拷貝2種。這篇文章會著重講2個方面:1: 淺拷貝和深拷貝的區別2: 淺拷貝和深拷貝的具體實現,拷貝我們常常用在把A對象的屬性copy到B對象,這樣B對象就擁有了A對象的屬性。

          理解JS中的深拷貝與淺拷貝

          了解深拷貝也不僅僅是為了應付面試題,在實際開發中也是非常有用的。例如后臺返回了一堆數據,你需要對這堆數據做操作,但多人開發情況下,你是沒辦法明確這堆數據是否有其它功能也需要使用,直接修改可能會造成隱性問題

          關于內存拷貝(淺拷貝)和js鏈表的小知識點

          記錄一個做leetcode看答案學到的小知識。。。淺拷貝實現一些特殊的功能的一些應用場景,比如:我們有一個需求如下

          javascript實現數組或對象的深拷貝

          可以看出來,改變原數組arr,并沒有對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;同樣:改變原數組arr,并沒有對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;

          JS中如何進行對象的深拷貝

          在JS中,一般的=號傳遞的都是對象/數組的引用,并沒有真正地拷貝一個對象,那如何進行對象的深度拷貝呢?對象的深拷貝與淺拷貝的區別如下:淺拷貝:僅僅復制對象的引用,而不是對象本身;深拷貝:把復制的對象所引用的全部對象都復制一遍。

          使用jquery克隆對象_實現深、淺拷貝的簡單實例

          克隆JavaScript對象,首頁想到的是obj = eval(uneval(obj)),但這是非標準的,推薦使用jquery提供的jQuery.extend方法,因為它包含了一些額外的類型驗證邏輯,并且不會復制未定義的屬性等。

          fly63.com版權所有,內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网