最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解JavaScript基礎(chǔ)之深拷貝和淺拷貝

 更新時(shí)間:2021年12月02日 17:08:04   作者:小豬弟  
這篇文章主要為大家介紹了JavaScript深拷貝和淺拷貝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

拷貝(又名克隆,復(fù)制等),但是又分深拷貝和錢(qián)拷貝。

其實(shí)這個(gè)問(wèn)題有時(shí)候想通了就很簡(jiǎn)單,如果想不通可能會(huì)有點(diǎn)繞,不過(guò)其難度比閉包等好理解的多。

為什么又這個(gè)概念的存在呢?先舉一個(gè)例子。

var person={
    name:"張三",
    age:22
}
var person1=person;
console.log(person);
console.log(person1);

在這里插入圖片描述

似乎可以被拷貝下來(lái)了,但是如果你操作person1的屬性值,這個(gè)時(shí)候person屬性值也會(huì)改變。

person1.name="李四";
console.log(person);
console.log(person1);

在這里插入圖片描述

其實(shí)這個(gè)很容易理解,那就是上面只是兩個(gè)對(duì)象的指針地址都是指向棧內(nèi)存的相同位置,前面講解引用數(shù)據(jù)類(lèi)型的時(shí)候講解過(guò)何為引用數(shù)據(jù)類(lèi)型。

補(bǔ)充 :

對(duì)象.屬性 和對(duì)象[屬性]其實(shí)都是操作對(duì)象的屬性值,只是兩個(gè)不同的寫(xiě)法而已。

那說(shuō)明這種指針賦值的方式不是拷貝,那什么就是拷貝呢,那就是一個(gè)新的對(duì)象用用了一個(gè)對(duì)象的所有屬性,但彼此不受影響。

這樣的理解就明白了,拷貝的本質(zhì)就是將一個(gè)對(duì)象的屬性循環(huán)賦值給一個(gè)新的對(duì)象而已。

那有為什么分淺拷貝和深拷貝,說(shuō)實(shí)話淺拷貝和深拷貝本質(zhì)上有什么什么區(qū)別嗎?

其實(shí)本質(zhì)沒(méi)有區(qū)別,最大的區(qū)別就是考慮的條件以及拷貝過(guò)程中的屬性類(lèi)型不同而已。

老規(guī)矩先看代碼

淺拷貝

var person={
    name:"張三",
    age:22
}
var person1={};
for( key in person){
    console.log(key);
    person1[key]=person[key];
}
console.log(person);
console.log(person1);

在這里插入圖片描述

person1.name="李四";
console.log(person);
console.log(person1);

在這里插入圖片描述

可以看出沒(méi)有彼此影響,但是又會(huì)涉及到新的問(wèn)題,那就是person對(duì)象的屬性都是基本數(shù)據(jù)類(lèi)型,如果是引用類(lèi)型呢?比如數(shù)組,對(duì)象呢?

var person={
    name:"張三",
    age:22,
    son:{
        firstSon:"張大毛"
    }
}
var person1={};
for( key in person){
    console.log(key);
    person1[key]=person[key];
}
console.log(person);
console.log(person1);

在這里插入圖片描述

現(xiàn)在修改一下person1的送屬性。

person1.son={firstSon:"李大毛"};
console.log(person);
console.log(person1);

在這里插入圖片描述

這樣看似乎也沒(méi)有彼此影響嗎?但是這個(gè)前面說(shuō)過(guò)對(duì)象.屬性=這樣等于重寫(xiě)賦值了person1.son的屬性,自然會(huì)斷開(kāi)引用彼此的影響,畢竟兩個(gè)地址不一樣。但是如下修改呢?

person1.son.secondeSon="李大毛";
console.log(person);
console.log(person1);

在這里插入圖片描述

驚不驚喜,意不意外還是彼此影響了,這個(gè)時(shí)候就需要一種新的操作了那就是深拷貝,說(shuō)白了就是將屬性值的有可能會(huì)為用引用類(lèi)型。

補(bǔ)充:

如果person的原型上有屬性值,也會(huì)被person1取到,賦值給person1.這個(gè)前面說(shuō)到過(guò),那樣的話就會(huì)用到hasOwnProperty這個(gè)來(lái)判斷是否屬于自己的屬性值。

深拷貝

其實(shí)深拷貝和淺拷貝的區(qū)別,相信看到這里幾乎已經(jīng)明白了差不多了,就是考慮屬性值的類(lèi)型而已。

// 上面補(bǔ)充了說(shuō)了原型上的值也會(huì)被拷貝下來(lái),為了方便直接用對(duì)象的原型鏈最后Object添加屬性。
Object.prototype.address="你猜";
var person={
    name:"張三",
    age:22,
    son:{
        firstSon:"張大毛"
    }
}
strtype=Object.prototype.toString;
var person1={};
// 為了方便這個(gè)地方用遞歸方法
function coleFun(origin,target){
 // 防止目標(biāo)對(duì)象本身有屬性
    target=target||{}
    for( key in origin){
        if(origin.hasOwnProperty(key)) 
         if(strtype.call(origin[key])=="[object Object]"){
            target[key]={};
            target[key]=coleFun(origin[key],target[key])
         }else{
            target[key]=origin[key];
          }   
    }
    return target;
}
person1=coleFun(person,person1)
console.log(person);
console.log(person1);

在這里插入圖片描述

看結(jié)果沒(méi)有問(wèn)題 現(xiàn)象修改一下屬性值試試

person1.son.secondeSon="李大毛";
console.log(person);
console.log(person1);

在這里插入圖片描述

現(xiàn)在看沒(méi)有問(wèn)題。

所謂的深淺拷貝,說(shuō)白了就是考慮屬性值是否會(huì)有引用類(lèi)型,然后在進(jìn)行拷貝而已。如果上面代碼沒(méi)有看懂的話,可能需要重溫一下引用數(shù)據(jù)和基本數(shù)據(jù)的區(qū)別,以及this指向,還有數(shù)據(jù)類(lèi)型的判斷方法。這寫(xiě)前面的文章都有聊過(guò),可以翻看一下。

補(bǔ)充

有個(gè)朋友在評(píng)論區(qū)說(shuō)如果如果用JavaScript中的JSON的方法進(jìn)行拷貝數(shù)據(jù),是深拷貝還是淺拷貝?

其實(shí)這個(gè)很容易證明的,那就是直接拷貝一個(gè)帶有引用數(shù)據(jù)類(lèi)型的對(duì)象,然后判斷其是否會(huì)彼此影響即可。

首先看一下其含有的兩種方法以及作用:

方法 作用
JSON.parse() 用于將一個(gè)JSON字符串轉(zhuǎn)換為 JavaScript 對(duì)象。
JSON.stringify() 用于將 JavaScript 值轉(zhuǎn)換為JSON字符串。

然后代碼演示:

var person={
    name:"張三",
    age:22,
    son:{
        firstSon:"張大毛"
    }
}
var str=JSON.stringify(person);
var person1=JSON.parse(str);
console.log(person);
console.log(person1);

在這里插入圖片描述

拷貝的目前看結(jié)果至少?zèng)]有問(wèn)題。

現(xiàn)在開(kāi)始測(cè)試,是否相互影響

person1.son.secondeSon="李大毛";
console.log(person);
console.log(person1);

在這里插入圖片描述

可見(jiàn)沒(méi)有相互影響,其是通過(guò)JOSN進(jìn)行拷貝其實(shí)是JavaScript一種常見(jiàn)的方式,畢竟比自己寫(xiě)要方便的很多。其本質(zhì)就是將對(duì)象轉(zhuǎn)成一個(gè)JSON格式的字符串,而通過(guò)字符串再生成一個(gè)對(duì)象而已,所以說(shuō)其也是一種深拷貝。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • js實(shí)現(xiàn)圖片局部放大效果詳解

    js實(shí)現(xiàn)圖片局部放大效果詳解

    這篇文章主要介紹了js實(shí)現(xiàn)圖片局部放大效果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • ES6基礎(chǔ)語(yǔ)法之函數(shù)介紹

    ES6基礎(chǔ)語(yǔ)法之函數(shù)介紹

    這篇文章介紹了ES6中函數(shù)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 淺析用prototype定義自己的方法

    淺析用prototype定義自己的方法

    下面小編將通過(guò)實(shí)例由淺入深講解 prototype 的具體使用方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • JavaScript中的運(yùn)算符種類(lèi)及其規(guī)則介紹

    JavaScript中的運(yùn)算符種類(lèi)及其規(guī)則介紹

    JavaScript中的運(yùn)算符有很多,主要分為算術(shù)運(yùn)算符,等同全同運(yùn)算符,比較運(yùn)算符,字符串運(yùn)算符,邏輯運(yùn)算符,賦值運(yùn)算符等,它們都有一個(gè)自己的運(yùn)算規(guī)則,在本文為大家介紹下
    2013-09-09
  • 了解JavaScript中的選擇器

    了解JavaScript中的選擇器

    這篇文章主要介紹了JavaScript中的選擇器,下面和小編一起了看看吧
    2019-05-05
  • JavaScript中的toDateString()方法使用詳解

    JavaScript中的toDateString()方法使用詳解

    這篇文章主要介紹了JavaScript中的toDateString()方法使用詳解,是JS入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-06-06
  • javascript中window.event事件用法詳解

    javascript中window.event事件用法詳解

    前兩天寫(xiě)程序時(shí)因?yàn)橐玫絡(luò)avascript中的window.event事件,于是就在網(wǎng)上搜了一下,終于找到一篇不錯(cuò)的文章,來(lái)與大家分享下
    2012-12-12
  • 對(duì)JavaScript客戶端應(yīng)用編程的一些建議

    對(duì)JavaScript客戶端應(yīng)用編程的一些建議

    這篇文章主要介紹了對(duì)JavaScript客戶端應(yīng)用編程的一些建議,主要針對(duì)MVC框架框架的一些相關(guān)使用問(wèn)題,需要的朋友可以參考下
    2015-06-06
  • 走出JavaScript初學(xué)困境—js初學(xué)

    走出JavaScript初學(xué)困境—js初學(xué)

    利用空閑幾天把《JavaScript權(quán)威指南》安靜的讀了一篇。真是一本好書(shū)呀!呵呵,這句話見(jiàn)的太多了。好在什么地方呢?聽(tīng)我慢慢道來(lái)。
    2008-12-12
  • JavaScript基礎(chǔ)之對(duì)象

    JavaScript基礎(chǔ)之對(duì)象

    這篇文章主要介紹了如何理解JavaScript中的對(duì)象,幫助大家更好的學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2021-11-11

最新評(píng)論

阿拉善盟| 宁波市| 桦甸市| 伊川县| 鄂托克前旗| 宜春市| 金堂县| 宁城县| 罗山县| 台南县| 潢川县| 兰州市| 共和县| 读书| 高淳县| 禹州市| 汨罗市| 龙川县| 上林县| 合川市| 仁怀市| 华宁县| 岑溪市| 岗巴县| 江安县| 琼海市| 葵青区| 剑川县| 怀集县| 肥乡县| 泽普县| 理塘县| 红桥区| 安西县| 长子县| 大宁县| 西青区| 界首市| 翁牛特旗| 高雄市| 泌阳县|