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

資訊專欄INFORMATION COLUMN

關(guān)于js的淺拷貝與深拷貝

summerpxy / 911人閱讀

摘要:原文地址淺拷貝和深拷貝只針對(duì)像這樣的復(fù)雜對(duì)象的簡單來說,淺拷貝只拷貝一層對(duì)象的屬性,而深拷貝則遞歸拷貝了所有層級(jí)。淺拷貝通過來實(shí)現(xiàn)淺拷貝。

原文地址:http://www.silenceboy.com/201...

淺拷貝和深拷貝只針對(duì)像Object, Array這樣的復(fù)雜對(duì)象的.簡單來說,淺拷貝只拷貝一層對(duì)象的屬性,而深拷貝則遞歸拷貝了所有層級(jí)。

淺拷貝 通過 Object.assign 來實(shí)現(xiàn)淺拷貝。
let a = {
    num: 1
}
let b = Object.assign({}, a)
a.num = 2
console.log(b.num) // 1
通過展開運(yùn)算符(…)來實(shí)現(xiàn)淺拷貝
let a = {
    num: 1
}
let b = {...a}
a.num = 2
console.log(b.num) // 1
通過屬性賦值來實(shí)現(xiàn)淺拷貝:
const obj = { a:1, arr: [2,3] };
const shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}

該方法體現(xiàn)了淺拷貝的問題.因?yàn)闇\拷貝只會(huì)將對(duì)象的各個(gè)屬性進(jìn)行依次拷貝,并不會(huì)進(jìn)行遞歸拷貝,而 JavaScript 存儲(chǔ)對(duì)象都是存地址的,所以淺拷貝會(huì)導(dǎo)致 obj.arr 和 shallowObj.arr 指向同一塊內(nèi)存地址.

導(dǎo)致的結(jié)果就是:

shallowObj.arr[1] = 5;
obj.arr[1]   // = 5

這種情況就需要用到深拷貝了.

深拷貝 通過JSON序列化實(shí)現(xiàn)深拷貝
你不知道的JavaScript(上) 
許多JavaScript框架都提出了自己的解決辦法,但是Javascript應(yīng)該采用那種方法作為標(biāo)準(zhǔn)吶? 在很長一段時(shí)間里,這個(gè)問題都沒有明確的答案.對(duì)于JSON安全(也就是說可以被序列化為一個(gè)JSON字符串并且可以根據(jù)這個(gè)字符串解析出一個(gè)結(jié)構(gòu)和值完全一樣的對(duì)象)的對(duì)象來說,有一種巧妙的復(fù)制方法:
var newObj = JSON.parse(JSON.stringify(someObj));

當(dāng)然,這種方法需要保證對(duì)象是JSON安全的,所以只適用于部分情況.

該方法的局限性:

會(huì)忽略 undefined

會(huì)忽略 symbol

不能序列化函數(shù)

不能解決循環(huán)引用的對(duì)象

遞歸完成深拷貝
function deepCopy(obj){
    //判斷是否是簡單數(shù)據(jù)類型,
    if(typeof obj == "object"){
        //復(fù)雜數(shù)據(jù)類型
        var result = obj.constructor == Array ? [] : {};
        for(let i in obj){
            result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
        }
    }else {
        //簡單數(shù)據(jù)類型 直接 == 賦值
        var result = obj;
    }
    return result;
}

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

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

相關(guān)文章

  • JS引用類型數(shù)據(jù)的淺拷貝與深拷貝

    摘要:拷貝到,屬性均順利拷貝。大輝小輝,小輝,大輝小輝,小輝,大輝但是,若修改的屬性變?yōu)閷?duì)象或數(shù)組時(shí),那么對(duì)象之間就會(huì)發(fā)生關(guān)聯(lián)。深拷貝不希望對(duì)象之間產(chǎn)生關(guān)聯(lián),那么這時(shí)候可以用到深拷貝。 淺拷貝 之前文章提到,在定義一個(gè)對(duì)象或數(shù)組時(shí),變量存放的往往只是一個(gè)地址。當(dāng)我們對(duì)堆內(nèi)存中的對(duì)象復(fù)制時(shí),如果屬性是對(duì)象或數(shù)組時(shí),這時(shí)候我們拷貝的只是一個(gè)棧內(nèi)存的指針。因此b對(duì)象在訪問該屬性時(shí),會(huì)根據(jù)指針尋找...

    MangoGoing 評(píng)論0 收藏0
  • JavaScript中的淺拷貝與深拷貝

    摘要:所以,深拷貝是對(duì)對(duì)象以及對(duì)象的所有子對(duì)象進(jìn)行拷貝實(shí)現(xiàn)方式就是遞歸調(diào)用淺拷貝對(duì)于深拷貝的對(duì)象,改變?cè)磳?duì)象不會(huì)對(duì)得到的對(duì)象有影響。 為什么會(huì)有淺拷貝與深拷貝什么是淺拷貝與深拷貝如何實(shí)現(xiàn)淺拷貝與深拷貝好了,問題出來了,那么下面就讓我們帶著這幾個(gè)問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處,還請(qǐng)看到的小伙伴多多指教,先行謝過 以下↓ 數(shù)據(jù)類型在開始了解 淺拷貝 與 深拷貝 之前,讓我們先...

    546669204 評(píng)論0 收藏0
  • JavaScript中的淺拷貝與深拷貝

    摘要:所以,深拷貝是對(duì)對(duì)象以及對(duì)象的所有子對(duì)象進(jìn)行拷貝實(shí)現(xiàn)方式就是遞歸調(diào)用淺拷貝對(duì)于深拷貝的對(duì)象,改變?cè)磳?duì)象不會(huì)對(duì)得到的對(duì)象有影響。 上一篇 JavaScript中的繼承 前言 文章開始之前,讓我們先思考一下這幾個(gè)問題: 為什么會(huì)有淺拷貝與深拷貝 什么是淺拷貝與深拷貝 如何實(shí)現(xiàn)淺拷貝與深拷貝 好了,問題出來了,那么下面就讓我們帶著這幾個(gè)問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處...

    AZmake 評(píng)論0 收藏0
  • 關(guān)于JavaScript的淺拷貝和深拷貝

    摘要:引用類型值引用類型值是保存在堆內(nèi)存中的對(duì)象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類型值的時(shí)候,其實(shí)只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型。JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。js的基本類型:undefined,null,string,boolean,number,s...

    shenhualong 評(píng)論0 收藏0
  • 淺談JavaScript的淺拷貝與深拷貝

    摘要:引用數(shù)據(jù)類型是存放在堆內(nèi)存中的,變量實(shí)際上是一個(gè)存放在棧內(nèi)存的指針,這個(gè)指針指向堆內(nèi)存中的地址。棧和堆的區(qū)別其實(shí)淺拷貝和深拷貝的主要區(qū)別就是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)類型不同。這里,對(duì)存在子對(duì)象的對(duì)象進(jìn)行拷貝的時(shí)候,就是深拷貝了。 數(shù)據(jù)類型 在開始拷貝之前,我們從JavaScript的數(shù)據(jù)類型和內(nèi)存存放地址講起。數(shù)據(jù)類型分為基本數(shù)據(jù)類型 和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型主要包括undefin...

    娣辯孩 評(píng)論0 收藏0

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<