中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript深拷貝和淺拷貝如何使用

發布時間:2021-12-06 16:06:38 來源:億速云 閱讀:196 作者:iii 欄目:開發技術

本篇內容主要講解“JavaScript深拷貝和淺拷貝如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JavaScript深拷貝和淺拷貝如何使用”吧!

拷貝(又名克隆,復制等),但是又分深拷貝和錢拷貝。

其實這個問題有時候想通了就很簡單,如果想不通可能會有點繞,不過其難度比閉包等好理解的多。

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

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

JavaScript深拷貝和淺拷貝如何使用

似乎可以被拷貝下來了,但是如果你操作person1的屬性值,這個時候person屬性值也會改變。

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

JavaScript深拷貝和淺拷貝如何使用

其實這個很容易理解,那就是上面只是兩個對象的指針地址都是指向棧內存的相同位置,前面講解引用數據類型的時候講解過何為引用數據類型。

補充 :

對象.屬性 和對象[屬性]其實都是操作對象的屬性值,只是兩個不同的寫法而已。

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

這樣的理解就明白了,拷貝的本質就是將一個對象的屬性循環賦值給一個新的對象而已。

那有為什么分淺拷貝和深拷貝,說實話淺拷貝和深拷貝本質上有什么什么區別嗎?

其實本質沒有區別,最大的區別就是考慮的條件以及拷貝過程中的屬性類型不同而已。

老規矩先看代碼

淺拷貝

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

JavaScript深拷貝和淺拷貝如何使用

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

JavaScript深拷貝和淺拷貝如何使用

可以看出沒有彼此影響,但是又會涉及到新的問題,那就是person對象的屬性都是基本數據類型,如果是引用類型呢?比如數組,對象呢?

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);

JavaScript深拷貝和淺拷貝如何使用

現在修改一下person1的送屬性。

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

JavaScript深拷貝和淺拷貝如何使用

這樣看似乎也沒有彼此影響嗎?但是這個前面說過對象.屬性=這樣等于重寫賦值了person1.son的屬性,自然會斷開引用彼此的影響,畢竟兩個地址不一樣。但是如下修改呢?

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

JavaScript深拷貝和淺拷貝如何使用

驚不驚喜,意不意外還是彼此影響了,這個時候就需要一種新的操作了那就是深拷貝,說白了就是將屬性值的有可能會為用引用類型。

補充:

如果person的原型上有屬性值,也會被person1取到,賦值給person1.這個前面說到過,那樣的話就會用到hasOwnProperty這個來判斷是否屬于自己的屬性值。

深拷貝

其實深拷貝和淺拷貝的區別,相信看到這里幾乎已經明白了差不多了,就是考慮屬性值的類型而已。

// 上面補充了說了原型上的值也會被拷貝下來,為了方便直接用對象的原型鏈最后Object添加屬性。
Object.prototype.address="你猜";
var person={
    name:"張三",
    age:22,
    son:{
        firstSon:"張大毛"
    }
}
strtype=Object.prototype.toString;
var person1={};
// 為了方便這個地方用遞歸方法
function coleFun(origin,target){
 // 防止目標對象本身有屬性
    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);

JavaScript深拷貝和淺拷貝如何使用

看結果沒有問題 現象修改一下屬性值試試

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

JavaScript深拷貝和淺拷貝如何使用

現在看沒有問題。

所謂的深淺拷貝,說白了就是考慮屬性值是否會有引用類型,然后在進行拷貝而已。如果上面代碼沒有看懂的話,可能需要重溫一下引用數據和基本數據的區別,以及this指向,還有數據類型的判斷方法。這寫前面的文章都有聊過,可以翻看一下。

補充

有個朋友在評論區說如果如果用JavaScript中的JSON的方法進行拷貝數據,是深拷貝還是淺拷貝?

其實這個很容易證明的,那就是直接拷貝一個帶有引用數據類型的對象,然后判斷其是否會彼此影響即可。

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

方法作用
JSON.parse()用于將一個JSON字符串轉換為 JavaScript 對象。
JSON.stringify()用于將 JavaScript 值轉換為JSON字符串。

然后代碼演示:

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

JavaScript深拷貝和淺拷貝如何使用

拷貝的目前看結果至少沒有問題。

現在開始測試,是否相互影響

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

JavaScript深拷貝和淺拷貝如何使用

可見沒有相互影響,其是通過JOSN進行拷貝其實是JavaScript一種常見的方式,畢竟比自己寫要方便的很多。其本質就是將對象轉成一個JSON格式的字符串,而通過字符串再生成一個對象而已,所以說其也是一種深拷貝。

到此,相信大家對“JavaScript深拷貝和淺拷貝如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌都县| 项城市| 秦皇岛市| 海门市| 都江堰市| 黄骅市| 太康县| 苍山县| 炉霍县| 松潘县| 枣庄市| 屯门区| 镇巴县| 江油市| 东阿县| 利津县| 托克托县| 镶黄旗| 柘荣县| 女性| 金沙县| 抚顺市| 康定县| 北辰区| 常宁市| 西吉县| 灵璧县| 重庆市| 仙桃市| 修武县| 陆良县| 永善县| 龙陵县| 南召县| 平阴县| 云浮市| 黔江区| 钟祥市| 营口市| 凌海市| 米脂县|