欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java深拷貝與淺拷貝的區(qū)別是什么

這篇文章主要介紹“Java深拷貝與淺拷貝的區(qū)別是什么”,在日常操作中,相信很多人在Java深拷貝與淺拷貝的區(qū)別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java深拷貝與淺拷貝的區(qū)別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開發(fā)人員和項(xiàng)目經(jīng)理組成的專業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺設(shè)計(jì)、用戶體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)易于使用并且具有良好的響應(yīng)性。

如何區(qū)分深拷貝與淺拷貝,大白話來說,就是假設(shè)B復(fù)制了A,當(dāng)修改A時(shí),看B是否會發(fā)生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。

先看一個(gè)例子:

let a = [0, 1, 2, 3, 4],
  b = a;
console.log(a === b); // true
a[0] = 9;
console.log(a, b);   // [9, 1, 2, 3, 4]

Java深拷貝與淺拷貝的區(qū)別是什么

吆哈,明明b復(fù)制了a,為啥修改數(shù)組a,數(shù)組b也跟著變了??

基本數(shù)據(jù)類型和復(fù)雜(引用)數(shù)據(jù)類型?

基本數(shù)據(jù)類型:number, string, boolean, null, undefined, symbol

引用數(shù)據(jù)類型:Object類,有常規(guī)名值對的無須對象{a: 1}, 數(shù)組[1, 2, 3],函數(shù)等。

而這兩類數(shù)據(jù)存儲方式分別是這樣的:

1. 基本類型–名值存儲在棧內(nèi)存中,例如let a=1;

Java深拷貝與淺拷貝的區(qū)別是什么

當(dāng)你b=a復(fù)制時(shí),棧內(nèi)存會新開辟一個(gè)內(nèi)存,例如這樣:

Java深拷貝與淺拷貝的區(qū)別是什么

所以當(dāng)你此時(shí)修改a=2,對b并不會造成影響,因?yàn)榇藭r(shí)的b已自食其力,翅膀硬了,不受a的影響了。當(dāng)然,let a=1, b=a; 雖然b不受a影響,但這也算不上深拷貝,因?yàn)樯羁截惐旧碇会槍^為復(fù)雜的object類型數(shù)據(jù)。

    2.引用數(shù)據(jù)類型–名存在棧內(nèi)存中,值存在于堆內(nèi)存中,但是棧內(nèi)存會提供一個(gè)引用的地址指向堆內(nèi)存中的值,我們以上面淺拷貝的例子畫個(gè)圖:

Java深拷貝與淺拷貝的區(qū)別是什么

當(dāng)b=a進(jìn)行拷貝時(shí),其實(shí)復(fù)制的是a的引用地址,而并非堆里面的值。

Java深拷貝與淺拷貝的區(qū)別是什么

而當(dāng)我們a[0]=1時(shí)進(jìn)行數(shù)組修改時(shí),由于a與b指向的是同一個(gè)地址,所以自然b也受了影響,這就是所謂的淺拷貝了。

Java深拷貝與淺拷貝的區(qū)別是什么

那,要是在堆內(nèi)存中也開辟一個(gè)新的內(nèi)存專門為b存放值,就像基本類型那樣,豈不就達(dá)到深拷貝的效果了。

Java深拷貝與淺拷貝的區(qū)別是什么

實(shí)現(xiàn)簡單的深拷貝方法?

先看幾個(gè)簡單例子?

1.slice() 方法

// 先看一個(gè)js中的方法slice() 方法可從已有的數(shù)組中返回選定的元素。
    // 該方法并不會修改數(shù)組,而是返回一個(gè)子數(shù)組。arrayObject.slice(start,end)
    let a1 = [1, 2, 3, 4],
      b2 = a1.slice();
      a1[0] = 2;
    console.log(a1, b2);

如上圖所述,slice()方法看似是一個(gè)深拷貝的方法了!在改造一下上述代碼片段,我們再看 ????

let a1 = [1, 2, [5,6], 3, 4],
      b2 = a1.slice();
      a1[0] = 2;
      a1[2][0] = 9;
    console.log(a1, b2);

拷貝的不徹底,b對象的一級屬性確實(shí)不受影響了,但是二級屬性還是沒能拷貝成功,仍然脫離不了a的控制,說明slice根本不是真正的深拷貝。

2.遞歸

// 簡單深拷貝封裝遞歸函數(shù)
    function deepClone(obj) {
      let objClone = Array.isArray(obj) ? [] : {};
      if (obj && typeof obj === "object") {
        for (key in obj) {
          if (obj.hasOwnProperty(key)) { // 注:hasOwnProperty()方法
            //判斷obj子元素是否為對象,如果是,遞歸復(fù)制
            console.log(obj[key])
            if (obj[key] && typeof obj[key] === "object") {
              objClone[key] = deepClone(obj[key]);
            } else {
              //如果不是,簡單復(fù)制
              objClone[key] = obj[key];
            }
          }
        }
      }
      return objClone;
    }
    let arr = [1, 2, [5, 6], 4],
      b1 = deepClone(arr);
    arr[2][0] = 9;
    console.log(arr, b1);
    // 跟之前想象的一樣,現(xiàn)在b脫離了a的控制,不再受a影響了。這里再次強(qiáng)調(diào),深拷貝,是拷貝對象各個(gè)層級的屬性。

Java深拷貝與淺拷貝的區(qū)別是什么

注:hasOwnProperty() 官方 MDN講解方法會返回一個(gè)布爾值,指示對象自身屬性中是否具有指定的屬性(也就是,是否有指定的鍵)。

3. 除了遞歸,我們還可以借用JSON對象的parse和stringify。

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
    b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

Java深拷貝與淺拷貝的區(qū)別是什么

4. 除了上面兩種方法之外,我們還可以借用JQ的extend方法。

$.extend( [deep ], target, object1 [, objectN ] )

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

target Object類型 目標(biāo)對象,其他對象的成員屬性將被附加到該對象上。

object1 objectN可選。 Object類型 第一個(gè)以及第N個(gè)被合并的對象。

let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

Java深拷貝與淺拷貝的區(qū)別是什么

到此,關(guān)于“Java深拷貝與淺拷貝的區(qū)別是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

名稱欄目:Java深拷貝與淺拷貝的區(qū)別是什么
標(biāo)題鏈接:http://chinadenli.net/article30/ppssso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、ChatGPT外貿(mào)建站、網(wǎng)站排名、App設(shè)計(jì)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
日韩欧美三级中文字幕| 欧美午夜视频免费观看| 日本不卡视频在线观看| 国内欲色一区二区三区| 国产免费人成视频尤物| 日本人妻丰满熟妇久久| 欧美美女视频在线免费看| 国产成人精品午夜福利| 日韩高清毛片免费观看| 亚洲国产av国产av| 日韩夫妻午夜性生活视频| 日韩欧美国产精品中文字幕| 好东西一起分享老鸭窝| 成人亚洲国产精品一区不卡| 成人精品国产亚洲av久久 | 精品人妻一区二区三区四区久久| 日韩精品中文字幕在线视频| 黄色日韩欧美在线观看| 欧美日韩久久精品一区二区 | 中文字幕一区二区久久综合| 亚洲欧美日韩色图七区| 91麻豆精品欧美视频| 亚洲视频偷拍福利来袭| 久久精品久久久精品久久| 亚洲国产丝袜一区二区三区四| 欧美日韩国产福利在线观看| 91精品视频全国免费| 亚洲国产欧美久久精品| 国产精品激情对白一区二区| 国产亚洲欧美另类久久久| 欧美精品女同一区二区| 日本精品中文字幕人妻| 亚洲一区二区三区四区性色av| 极品少妇嫩草视频在线观看| 国产麻豆精品福利在线| 国产精品久久男人的天堂| 日韩精品福利在线观看| 日韩精品区欧美在线一区| 国内自拍偷拍福利视频| 国产精品美女午夜福利| 少妇肥臀一区二区三区|