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

資訊專欄INFORMATION COLUMN

js對象的深淺拷貝

dinfer / 1491人閱讀

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

js對象的深淺拷貝

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

//1.循環復制數組
var arr = [1,2,3],arr2 = [];
for(var i=0;i

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

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

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

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

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

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

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

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

//下面的方法可以實現 深深度復制(復制包括函數)

function deepClone(oldObj){
        var newObj = {};
        for(var key in oldObj){
                if(oldObj.hasOwnProperty(key)){
                        if(oldObj[key].constructor == Array){ //判斷oldObj[key]值是否數組/對象
                                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);

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

js堆棧

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102169.html

相關文章

  • JS專題之深淺拷貝

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

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

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

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

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

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

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

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

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

    MobService 評論0 收藏0

發表評論

0條評論

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