js在平時的專案中,賦值操作是最多的;比如說:
1var person1 =
13var person2 =person1;
14console.log(person2)
15 person2.name = "李四";
16 console.log(person1,person2);
那麼問題來了,怎麼讓 person2 複製 person1的值,並且 person2改變值,不影響 person1 的值???
這裡,我們可以重新建立person3,person3是個空物件;person3迴圈獲取person1的值。即:
1var person3 ={}
2for(var key in
person1)
5console.log(person3);
6 person3.name = "王五";
7 console.log(person3,person1)
這裡 person3 的name變成了王五,但是呢 person1的name 還是張三;
這個就是淺拷貝;
但是問題又接著出現了;
這個時候,我把person1修改了一下;增加了乙個son物件;並且了,我封裝了淺拷貝,把他做成了函式:
1function
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();
1var 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...