亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

面試篇---1 如何區(qū)分深拷貝與淺拷貝

jsdt / 2547人閱讀

摘要:引用數(shù)據(jù)類型名存在棧內(nèi)存中,值存在于堆內(nèi)存中,但是棧內(nèi)存會提供一個引用的地址指向堆內(nèi)存中的值,我們以上面淺拷貝的例子畫個圖當進行拷貝時,其實復(fù)制的是的引用地址,而并非堆里面的值。

如何區(qū)分深拷貝與淺拷貝?

簡單來說,就是假設(shè)B復(fù)制了A,當修改A時,看B是否會發(fā)生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。

淺拷貝例子:

 var a=[0,1,2,3,4],
       b=a;
    console.log(a===b);
    a[0]=1;
    console.log(a,b);  
    

嗯?明明b復(fù)制了a,為啥修改數(shù)組a,數(shù)組b也跟著變了,這里我不禁陷入了沉思。

那么這里,就得引入基本數(shù)據(jù)類型與引用數(shù)據(jù)類型的概念了。

面試常問,基本數(shù)據(jù)類型有哪些,number,string,boolean,null,undefined五類。

引用數(shù)據(jù)類型(Object類)有常規(guī)名值對的無序?qū)ο髙a:1},數(shù)組[1,2,3],以及函數(shù)等。

而這兩類數(shù)據(jù)存儲分別是這樣的:
a.基本類型--名和值存儲在棧內(nèi)存中,例如let a=1;

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

所以當你此時修改a=2,對b并不會造成影響,因為此時的b已自食其力,翅膀硬了,不受a的影響了。雖然b不受a影響,但這也算不上深拷貝,因為深拷貝本身只針對較為復(fù)雜的object類型數(shù)據(jù)。

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

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

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

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

那么如何實現(xiàn)深拷貝呢?
1、我們可以借用JSON對象的parse和stringify

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


現(xiàn)在b完全不受a的影響了。

2、借用JQ的extend方法。

$.extend( [deep ], target, object1 [, objectN ] )
deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝
target Object類型 目標對象,其他對象的成員屬性將被附加到該對象上。
object1 objectN可選。 Object類型 第一個以及第N個被合并的對象。

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

。

其實深拷貝也不僅僅是為了應(yīng)付面試題, 在實際開發(fā)中也是非常有用的。 例如后臺返回了一堆數(shù)據(jù),你需要對這堆數(shù)據(jù)做操作,
但多人開發(fā)情況下,你是沒辦法明確這堆數(shù)據(jù)是否有其它功能也需要使用, 直接修改可能會造成隱性問題,深拷貝能幫你更安全安心的去操作數(shù)據(jù),
根據(jù)實際情況來使用深拷貝,大概就是這個意思。

原文鏈接https://www.cnblogs.com/echol...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101506.html

相關(guān)文章

  • 「前端面試題系列9」淺拷貝拷貝的含義、區(qū)別及實現(xiàn)(文末有崗位內(nèi)推哦~)

    摘要:深拷貝與淺拷貝的出現(xiàn),就與這兩個數(shù)據(jù)類型有關(guān)。這時,就需要用淺拷貝來實現(xiàn)了。數(shù)據(jù)一但過多,就會有遞歸爆棧的風(fēng)險。這個方法是在解決遞歸爆棧問題的基礎(chǔ)上,加以改進解決循環(huán)引用的問題。但如果你并不想保持引用,那就改用用于解決遞歸爆棧即可。 前言 這是前端面試題系列的第 9 篇,你可能錯過了前面的篇章,可以在這里找到: 數(shù)組去重(10 種濃縮版) JavaScript 中的事件機制(從原生到...

    caige 評論0 收藏0
  • JS 中的拷貝與淺拷貝

    摘要:什么是深拷貝淺拷貝見名知義,無論是深拷貝還是淺拷貝,都是的問題。使用如下以上就是關(guān)于中的深拷貝與淺拷貝的知識和如何進行深拷貝的知識了,如果有錯或者有其他方式的話,歡迎在下面留言評論啦 前言 最近在寫項目的時候涉及到一些父子組件傳遞個對象或者數(shù)組通信啥的,或者是直接復(fù)制添加對象啥的,直接使用賦值的時候總會出錯。一查原來是淺拷貝的問題,就從網(wǎng)上找了點資料,匯總到這里來了。 1 什么是深拷貝...

    ztyzz 評論0 收藏0
  • 7.JS之拷貝

    摘要:深拷貝與淺拷貝的區(qū)別如何區(qū)分深拷貝與淺拷貝,簡單點來說,就是假設(shè)復(fù)制了,當修改時,看是否會發(fā)生變化,如果也跟著變了,說明這是淺拷貝,拿人手短,如果沒變,那就是深拷貝,自食其力。 1.深拷貝與淺拷貝的區(qū)別 如何區(qū)分深拷貝與淺拷貝,簡單點來說,就是假設(shè)B復(fù)制了A,當修改A時,看B是否會發(fā)生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 2.棧堆、基本...

    dailybird 評論0 收藏0
  • JS每日一題:拷貝與淺拷貝的區(qū)別?如何實現(xiàn)一個拷貝

    摘要:期深拷貝與淺拷貝的區(qū)別如何實現(xiàn)一個深拷貝在回答這個問題前,我們先來回顧一下中兩大數(shù)據(jù)類型基本類型引用類型基本類型基本類型就是值類型存放在棧內(nèi)存中的簡單數(shù)據(jù)段,數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配引用類型引用類型存放在堆內(nèi)存中的對象,變量實際保 20190311期 深拷貝與淺拷貝的區(qū)別?如何實現(xiàn)一個深拷貝 在回答這個問題前,我們先來回顧一下JS中兩大數(shù)據(jù)類型 基本類型 Undefined...

    MiracleWong 評論0 收藏0
  • js中拷貝與淺拷貝(堆內(nèi)存、棧內(nèi)存的關(guān)系)

    摘要:而堆內(nèi)存主要負責像對象這種變量類型的存儲,如下圖引用類型中復(fù)制淺拷貝的只是棧內(nèi)存中的指針,指向同一個堆內(nèi)存的對象如何實現(xiàn)深拷貝最簡單的方法就是與方法 淺拷貝只會在引用類型中出現(xiàn) 基本數(shù)據(jù)類型有哪些,number,string,boolean,null,undefined,symbol以及未來ES10新增的BigInt(任意精度整數(shù))七類。 引用數(shù)據(jù)類型(Object類)有常規(guī)名值對的無...

    AlienZHOU 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<