天天看點

js對象之深淺拷貝

前述: js分為簡單類型和複雜類型, (簡單、複雜類型有哪些可自行google)

簡單類型拷貝方式 可以直接用 =     :let a = 5; let b = a;

即可将 a 拷貝(複制)給 b, 并且,a、b 都有獨立的記憶體,改變b的值也不會影響 a

而複雜類型(例如: 對象object );let a = {name: 'xx'}; let b = a;

複雜類型如果用簡單的 = 進行拷貝,隻是淺拷貝,

何為淺拷貝? 将 a 淺拷貝給 b,其實a , b 都指向同一個位址,a 隻是将位址給了b一份。

  當指向了同一個位址時,修改 a 的值,b也會跟着改變,修改 b 的值,a也會跟着改變;

是以,複雜類型 的拷貝不能用簡單的 = 來操作,

es6提供一個方法,

Object.assign(); 作用,将 b 拷貝給 a,改變 b 的值,a也不會改變,

object.assign的使用方法  : 

let obj1 = {name: 'xx', child:{age: 18}};

let obj2 = Object.assign({}, obj1);

但是,object.assign()隻能拷貝一層,對象的層級深了,也沒用,第二層以下的都是淺拷貝;child的值就是第二層

使用Object.assign方式隻拷貝了對象的第一層, 第二層或之後都隻拷貝了指針;修改obj2第二層,obj1還是會跟着改變

深拷貝的解決方案:

 // 深拷貝, 修改 obj2 或 obj1 任意的資料, obj1 或 obj2 都不會改變

  obj2 = JSON.parse(JSON.stringify(obj1));

繼續閱讀