js 中的 深拷貝與淺拷貝

2022-06-20 14:27:13 字數 1841 閱讀 6558

js在平時的專案中,賦值操作是最多的;比如說:

1

var person1 =

13var person2 =person1;

14console.log(person2)

15 person2.name = "李四";

16 console.log(person1,person2);

那麼問題來了,怎麼讓 person2 複製 person1的值,並且 person2改變值,不影響 person1 的值???

這裡,我們可以重新建立person3,person3是個空物件;person3迴圈獲取person1的值。即:

1

var person3 ={}

2for(var key in

person1)

5console.log(person3);

6 person3.name = "王五";

7 console.log(person3,person1)

這裡 person3 的name變成了王五,但是呢 person1的name 還是張三;

這個就是淺拷貝

但是問題又接著出現了;

這個時候,我把person1修改了一下;增加了乙個son物件;並且了,我封裝了淺拷貝,把他做成了函式:

1

function

clone(origion,target);

3for(key in

origion)7}

8return

tar;9}

1011 object.prototype.num = 1;

12var person1 =23}

2425

var person4 =clone(person1);

person4.son.six = "ben"

26 console.log(person4,person1)

這個時候,person4的son 物件 有了這個 ben,但是 person1 的 son 物件也有。這個就是淺拷貝的乙個問題,他只能拷貝 物件 陣列的 引用值;

這個時候,可以通過深拷貝來解決這個問題;

1

//深拷貝 js原生

2function

deepclone(origion,target);

4for(key in

origion)else

if(mytypeof(origion[key]) == "object");

11deepclone(origion[key],tar[key]);12}

13 tar[key] =origion[key];

1415}16

}17return

tar;18}

19var person5 =deepclone(person1)

20 person5.son.fifth = "111111";

21 console.log(person5,person1)

當然還可以通過 json方式 來實現 深拷貝 json.stringify() json.parse();

1

var person1 =

12};

1314

var str = json.stringify(person1)//

把 person1轉成字串

15var json = json.parse(str)//

把字串轉成 json物件,此時的person1 和 json實現了深拷貝

js中的深拷貝與淺拷貝

今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結 js中針對引用型別的拷貝分為兩種 深拷貝和淺拷貝 淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如 var obj var newobj obj newobj.a...

JS中的深拷貝與淺拷貝

說到深淺拷貝的時候就不得不說一下js中的變數型別了 淺拷貝分兩種情況,拷貝源物件的引用和源物件拷貝例項,但其屬性拷貝引用.拷貝源的引用 eg let obj1 let obj2 obj1 console.log obj1 obj2 true obj1.a 2 console.log obj2.a 2...

JS中的深拷貝與淺拷貝

深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,深拷貝的實現 1.通過遞迴解決 var a function deepcopy initobj,finalobj for var i in initobj if typeof initobj i object argume...