国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js對象的深淺拷貝

dinfer / 1486人閱讀

摘要:對象的深淺拷貝針對于的對象和數(shù)組數(shù)組也是對象淺拷貝只是引用,內(nèi)存不變而深拷貝就是遞歸賦值。往往需要深拷貝的對象里沒有函數(shù),也不需要拷貝它原型鏈上的屬性。

js對象的深淺拷貝

針對于JavaScript的對象和數(shù)組(數(shù)組也是對象)淺拷貝只是引用,內(nèi)存不變;而深拷貝就是遞歸賦值。
深拷貝是不同內(nèi)存,相互獨立。而淺拷貝會影響

//1.循環(huán)復(fù)制數(shù)組
var arr = [1,2,3],arr2 = [];
for(var i=0;i

別急著走,利用window.JSON的方法做深拷貝存在2個 缺點:

如果你的對象里有函數(shù),函數(shù)無法被拷貝下來

無法拷貝對象原型鏈上的屬性和方法

例如下面這種情況:對象里包含函數(shù)

var o1 = {
    name:"小明",
    age:12,
    city:"廣州",
    schools:["小學(xué)","中學(xué)","大學(xué)"],
    say:function(){
            alert(this.name);
    }
}

for...in 遍歷對象,找出自身的屬性,且會搜索原型,即也會查找原型上的屬性
__proto__不可枚舉的屬性

obj.hasOwnProperty() 返回布爾值 判斷屬性是否是自有屬性

JSON.parse(JSON.stringify(o1)) 可以將只有屬性/不存在方法的對象復(fù)制
JSON.stringify 將對象轉(zhuǎn)換成字符串,轉(zhuǎn)換的過程,會忽略掉方法.

//下面的方法可以實現(xiàn) 深深度復(fù)制(復(fù)制包括函數(shù))

function deepClone(oldObj){
        var newObj = {};
        for(var key in oldObj){
                if(oldObj.hasOwnProperty(key)){
                        if(oldObj[key].constructor == Array){ //判斷oldObj[key]值是否數(shù)組/對象
                                newObj[key] = oldObj[key].slice();
                        }else if(oldObj[key].constructor == Object){
                                newObj[key] == deepClone(oldObj[key]);
                        }else{
                                newObj[key] = oldObj[key];
                        }
                }
        }
        return newObj;
}
var o2 = deepClone(o1);

當(dāng)然,你明確知道他們的缺點后,如果他的缺點對你的業(yè)務(wù)需求沒有影響,就可以放心使用了,一行原生代碼就搞定。
目前我在開發(fā)業(yè)務(wù)場景中,大多還真可以忽略上面2個缺點。往往需要深拷貝的對象里沒有函數(shù),也不需要拷貝它原型鏈上的屬性。

js堆棧

由于js中的對象都是復(fù)雜數(shù)據(jù)類型,這種數(shù)據(jù)在內(nèi)存中存儲的時候,存放在堆中。當(dāng)簡單賦值的時候,其實是將該對象的指針指向同一個堆地址。
簡單的數(shù)據(jù)類型存放在棧中,當(dāng)對簡單的數(shù)據(jù)類型進(jìn)行賦值的時候,其實就是直接在棧中新開辟一個地方專門存儲一樣的值。

數(shù)據(jù)結(jié)構(gòu)里的堆棧:
棧(stack): 由編譯器自動分配, 存放函數(shù)的參數(shù)值, 局部變量的值等. 其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧.
堆(heap): 一般由程序員分配釋放, 若程序員不釋放, 程序結(jié)束時可能由OS回收. 這里OS是指: 操作系統(tǒng)(Operating System)

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102169.html

相關(guān)文章

  • JS專題之深淺拷貝

    摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會遇到這種場景,拿到一個數(shù)據(jù)后,你打算對它進(jìn)行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...

    ASCH 評論0 收藏0
  • 深入理解JS深淺拷貝

    摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(nèi)存就有兩個指針指向堆內(nèi)存同一個數(shù)據(jù)。結(jié)果如下擴(kuò)展運算符只能對一層進(jìn)行深拷貝如果拷貝的層數(shù)超過了一層的話,那么就會進(jìn)行淺拷貝那么我們可以看到和展開原算符對于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...

    JackJiang 評論0 收藏0
  • 9012年,當(dāng)我們討論js深淺拷貝時我們在說些什么?

    摘要:正文討論深淺拷貝,首先要從的基本數(shù)據(jù)類型說起根據(jù)中的變量類型傳遞方式,分為值類型和引用類型,值類型變量包括。當(dāng)你拷貝的對象有多級的時候,就是深拷貝。數(shù)據(jù)不存在則對其拷貝。 前言: 本文主要閱讀對象:對深淺拷貝印象模糊對初級前端,想對js深淺拷貝聊一聊的中級前端。 如果是對這些有完整對認(rèn)知體系和解決方法的大佬,可以選擇略過。 正文: 討論深淺拷貝,首先要從js的基本數(shù)據(jù)類型說起: 根據(jù) J...

    xeblog 評論0 收藏0
  • 深淺拷貝

    摘要:深復(fù)制實現(xiàn)代碼如下第一種方法通過遞歸解析解決第二種方法通過解析解決作者六師兄鏈接原生深拷貝的實現(xiàn)處理未輸入新對象的情況通過方法構(gòu)造新的對象 深淺拷貝針對的是 對象類型,如果是字符串的數(shù)組用[...arr],還是不會影響 要區(qū)分針對數(shù)組的深淺拷貝(默認(rèn)情況為里面沒有對象的數(shù)組),與針對對象的深淺拷貝 JavaScript數(shù)組深拷貝和淺拷貝的兩種方法 let a1 = [1, 2]; ...

    Karrdy 評論0 收藏0
  • 復(fù)習(xí)Javascript專題(四):js深淺拷貝

    摘要:基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對,這類引用類型數(shù)據(jù)。它會拋棄對象的。另外,查資料過程中還看到這么一個詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對于字符串來說,是值的復(fù)制,而對于對象來說則是對對象地址的復(fù)制;而深拷貝的話,它不...

    MobService 評論0 收藏0

發(fā)表評論

0條評論

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