工作中可能會遇到這樣乙個問題,我明明把資料拷貝了乙份,但改變拷貝後的資料居然同時會改變原始資料中的值。那就來看看為什麼吧,希望這篇文章可以給你解惑。
「只拷貝了資料物件的第一層,深層次的資料值與原始資料會互相影響(拷貝後的資料與原始資料還存有關聯)」
常見淺拷貝的方式:object.assign()
、擴充套件運算子
當拷貝後的物件const obj1 =
}const obj2 = object.
assign
(, obj1)
// 或者
const obj2 =
obj2.name =
'cat'
obj2.info.age =
4console.
log(obj1)
// }
console.
log(obj2)
// }
obj2
資料改變的時候會影響原始資料obj1
,因為info
物件拷貝的是源物件指標。
不清楚指標的可以看前面的這篇文章
js基礎面試高頻(一):資料型別
「不管資料物件有多少層,改變拷貝後的值都不會影響原始資料的值。(拷貝後的資料與原始資料毫無關係)」
常見深拷貝的方式:json.parse()
和json.stringify()
配合使用
這種方式有乙個弊端,就是無法正確處理const obj1 =
, fn:
function()
}const obj2 =
json
.parse
(json
.stringify
(obj1)
)obj2.name =
'cat'
obj2.info.age =
4console.
log(obj1)
// , fn: function(){} }
console.
log(obj2)
// }
函式
和正則
我們也可以手寫乙個深拷貝的方法(簡易基礎版)
function
deepclone
(source)
// 校驗要拷貝的資料是物件還是陣列
const target = array.
isarray
(source)?[
]:for(
const k in source)`)
()}else
if(valuetype ===
'object'
)else
}return target
}const obj1 =
, fn:
function()
}const obj2 =
deepclone
(obj1)
obj2.name =
'cat'
obj2.info.age =
4console.
log(obj1)
// , fn: function(){} }
console.
log(obj2)
// , fn: function(){} }
js 物件深拷貝 深拷貝與淺拷貝
前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...
js物件淺拷貝與深拷貝
在js中,如果乙個物件,作為變數賦值給另乙個物件,那麼兩個物件得值會是相同得引用位址,其中乙個改變,另外乙個也會隨之改變。var obj1 var obj2 obj1 obj2.num 456 console.log obj1.num 輸出 456 複製 在我們日常開發過程當中,我們去複製乙個物件得...
Map物件的淺拷貝與深拷貝
問題 map拷貝時發現資料會變化。先看例子 public class copymap 上面程式的期望輸出值是,mapfrist的值均為1,但是實際上輸出結果為 這裡是因為map發生了淺拷貝,mapfirst只是複製了map的引用,和map仍使用同乙個記憶體區域,所以,在修改map的時候,mapfir...