成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript對(duì)象的深淺拷貝

qieangel2013 / 3411人閱讀

摘要:開(kāi)門(mén)見(jiàn)山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級(jí)屬性修改深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。

開(kāi)門(mén)見(jiàn)山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。
其實(shí)都是copy。

深拷貝(遞歸復(fù)制,復(fù)制所有層級(jí),獨(dú)立副本,一個(gè)完全和原來(lái)對(duì)象屬性無(wú)關(guān)的副本)
返回對(duì)象:一個(gè)。
傳入對(duì)象:一個(gè)。
條件:JSON安全的對(duì)象,可以序列化為JSON字符串,并且可以解析為新的字符串。
深拷貝算法:

function deepCopy(data){
    let memory = null;
    const type = Object.prototype.toString.call(data);
    if (type === "[object Array]"){
        memory = []
        for (let i=0 ;i{
            memory[key] = data[key]
        })
    }else{
        return data;
    }
    return memory;
}

jQuery深拷貝:
var copiedObject = jQuery.extend(true, {}, originalObject)

es6深拷貝:
var copiedObject= JSON.parse(JSON.stringify(originalObject));

深拷貝是遞歸復(fù)制,新復(fù)制的對(duì)象與原對(duì)象是完全獨(dú)立的兩個(gè)對(duì)象,它們指向不同的內(nèi)存地址,做set不會(huì)影響到對(duì)方。

淺拷貝(單次復(fù)制,復(fù)制最高層級(jí),引用副本,一個(gè)基于對(duì)原對(duì)象屬性引用的副本)
返回對(duì)象:一個(gè)。
傳入對(duì)象:一個(gè)或多個(gè)。
條件:無(wú)。

jQuery淺拷貝:
var copiedObject = jQuery.extend({}, originalObject)

es6淺拷貝:
var copiedObject = Object.assign({},originalObject)

es7淺拷貝:
var copiedObject = {...originalObject}

淺拷貝算法:

  function shallowCopyObj(original){
        let copy = {}
        Object.keys(original).forEach(key=>{
            copy[key] = original[key]
        })
        return copy
    }

由于javascript的對(duì)象是存地址的,所以淺復(fù)制的對(duì)象與原對(duì)象,都指向同一個(gè)內(nèi)存地址,屬于引用復(fù)制,做set會(huì)影響到對(duì)方。

實(shí)驗(yàn):
①普通屬性修改:深拷貝和淺拷貝都可以滿足對(duì)象的復(fù)制。
普通屬性是指value值為非Array,Object類(lèi)型的數(shù)據(jù)類(lèi)型,也就是Number,String,Boolean等基本數(shù)據(jù)類(lèi)型。
原因:基本數(shù)據(jù)類(lèi)型屬于值傳遞。

var obj = {foo:1};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("deepCopyObj.foo:",deepCopyObj.foo);//2
var obj = {foo:1};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("shallowCopyObj.foo:",shallowCopyObj.foo);//2

②高級(jí)屬性修改:深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。
高級(jí)屬性是指Array,Object數(shù)據(jù)類(lèi)型。
原因:基本數(shù)據(jù)類(lèi)型屬于引用傳遞。

var obj = {foo:1,bar:{baz:1}};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//1
console.log("deepCopyObj.bar.baz:",deepCopyObj.bar.baz);//2
var obj = {foo:1,bar:{baz:1}};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//2 Attention!
console.log("shallowCopyObj.bar.baz:",shallowCopyObj.bar.baz);//2

印象中const也是保持變量地址不變的操作,那么es6中的let和const對(duì)于對(duì)象的深淺拷貝有影響嗎?

也就是將上面代碼中的var替換為let和const。

實(shí)驗(yàn)結(jié)果是let和const不會(huì)影響深淺拷貝的結(jié)果,因?yàn)閘et強(qiáng)調(diào)塊作用域,而const強(qiáng)調(diào)變量整體地址空間的不變性。

關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。

謝謝您的閱讀~

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94138.html

相關(guān)文章

  • JavaScript深淺拷貝

    摘要:什么是深淺概念深拷貝淺拷貝只針對(duì)像這樣的對(duì)象,對(duì)于基本類(lèi)型而言,可以理解為是沒(méi)有深淺的區(qū)別的。和指向了同一塊內(nèi)存深拷貝重新開(kāi)辟了一個(gè)空間,修改對(duì)象的屬性,彼此不會(huì)影響。并不會(huì)更改使用遞歸適用于對(duì)象里面有對(duì)象 什么是深淺 概念 深拷貝、淺拷貝只針對(duì)像Object/Array這樣的對(duì)象,對(duì)于基本類(lèi)型而言,可以理解為是沒(méi)有深淺的區(qū)別的。 淺拷貝復(fù)制的是引用,修改對(duì)象的屬性,會(huì)彼此影響。 ju...

    zhunjiee 評(píng)論0 收藏0
  • JavaScript專題之深淺拷貝

    摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個(gè)新數(shù)組的特性來(lái)實(shí)現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...

    RancherLabs 評(píng)論0 收藏0
  • 深淺拷貝

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

    Karrdy 評(píng)論0 收藏0
  • javascript深淺拷貝

    摘要:為何寫(xiě)最近在研究深淺拷貝,找了很多資料,感覺(jué)不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個(gè)屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實(shí)現(xiàn) 為何寫(xiě): 最近在研究深淺拷貝,找了很多資料,感覺(jué)不是很滿意,所以自己就整理了一份。廢話不多說(shuō),我們來(lái)一起復(fù)習(xí)一下吧,也希望留下您寶貴意見(jiàn)。 何為深淺拷貝?...

    LMou 評(píng)論0 收藏0
  • JavaScript深淺拷貝

    摘要:基本類(lèi)型指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類(lèi)型指的是一個(gè)對(duì)象保存在堆內(nèi)存中的地址,不允許我們直接操作內(nèi)存中的地址,也就是說(shuō)不能操作對(duì)象的內(nèi)存空間,所以,我們對(duì)對(duì)象的操作都只是在操作它的引用而已。 工作中經(jīng)常會(huì)遇到需要復(fù)制 JavaScript 數(shù)據(jù)的時(shí)候,遇到 bug 時(shí)實(shí)在令人頭疼;面試中也經(jīng)常會(huì)被問(wèn)到如何實(shí)現(xiàn)一個(gè)數(shù)據(jù)的深淺拷貝,但是你對(duì)其中的原理清晰嗎?一起來(lái)看一下吧! 一、為什么會(huì)有深淺...

    Tonny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<