tft每日頭條

 > 生活

 > 一篇文章徹底搞懂淺拷貝和深拷貝

一篇文章徹底搞懂淺拷貝和深拷貝

生活 更新时间:2024-11-29 16:26:42

此篇文章中也會簡單闡述到 棧堆基本數據類型引用數據類型 ,因為這些概念能更好的讓你理解深拷貝與淺拷貝。

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複制了A,當修改A時,看B是否會發生變化,如果B也跟着變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。

舉個栗子,有時候開發中會遇到一下情況

let a = [1,2,3,4,5] let b = a console.log(a === b) // true 因為棧内存a、棧内存b訪問的同一塊堆内存 // 那麼問題來了 a[0] = '我變了昂' console.log(b) // ['我變了昂',2,3,4,5] 怎麼肥事 //因為b = a等同于b是a的快捷方式,他們指向同一塊内存,所以取出來的值一定會随着a的變化 b也可以成為引用類型數據

面試常問,基本數據類型有哪些,number,string,boolean,null,undefined五類。

引用數據類型(Object類)有常規名值對的無序對象{a:1},數組[1,2,3],以及函數等。

基本數據類型與引用數據類型的區别基本數據類型

例如 let a = 1

一篇文章徹底搞懂淺拷貝和深拷貝(深拷貝淺拷貝)1

當你b深拷貝a複制時,棧内存會新開辟一個内存,例如這樣:

一篇文章徹底搞懂淺拷貝和深拷貝(深拷貝淺拷貝)2

所以當你此時修改a=2,對b并不會造成影響,因為此時的b有獨立的内存空間了,不受a的影響了。當然,let a=1,b=a;雖然b不受a影響,但這也算不上深拷貝,因為深拷貝本身隻針對較為複雜的object類型數據。

引用數據類型

引用數據類型–名存在棧内存中,值存在于堆内存中,但是棧内存會提供一個引用的地址指向堆内存中的值 ,我們以上面淺拷貝的例子畫個圖:

一篇文章徹底搞懂淺拷貝和深拷貝(深拷貝淺拷貝)3

其實上圖表示b=a 其實是将b的堆内存指向與a相同的内存

實現深拷貝的方法

1.根據數據類型封裝一個方法

function deepClone(obj) { let newobj = obj instanceof Array ? [] : {} // 或者 Array.isArray(obj)?[]: {} // 上邊的方法是判斷obj的數據類型 是對象還是數組 if (typeof obj !== 'obj') { return obj // 判斷是不是基本數據類型,如果是直接返回 } else { // 數組、類數組、對象 for(var key in obj) { newobj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key] // 判斷obj[key]是不是數組或者對象,如果是則傳進deepClone,否則直接返回 } } return newobj }

2.使用JSON的stringify()、parse()

const deepClone = (obj) => { return JSON.parse(JSON.stringify(obj)) }

3.使用JQ的$.extends

$.extend( [deep ], target, object1 [, objectN ] )

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

target Object類型 目标對象,其他對象的成員屬性将被附加到該對象上。

object1 objectN可選。 Object類型 第一個以及第N個被合并的對象。

let a=[0,1,[2,3],4], b=$.extend(true,[],a); a[0]=1; a[2][0]=1; console.log(a,b)

不知道有沒有在魔都的小夥伴,你們會房子的時候會不會特别煩,覺得生活好難啊。

另外那個平台租房子便宜一些,昨天遇到一個中介,隔闆間都要問我要2800,我的錢是大風刮來的嗎?

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved