javaScritp的數據類型按存儲方式,分爲基本數據類型和引用數據類型。基本數據類型保存在棧內存,引用類型保存在堆內存中。保存在棧內存是大小固定的數據,而引用類型的大小不固定,只能保存在堆內存中,可是它的地址寫在棧內存中能夠供咱們訪問。
基本數據類型是按值訪問,操做的就是變量保存的值;對於引用類型,咱們只是經過保存在變量中的引用類型的地址來操做實際對象。因此基本數據類型的複製能夠經過簡單的賦值來進行,而引用數據類型複製的則是其地址。所以對引用類型數據,分爲深拷貝與淺拷貝。淺拷貝只複製指向某個對象的指針,而不復制對象自己,新舊對象仍是共享同一塊內存。但深拷貝會另外創造一個如出一轍的對象,新對象跟原對象不共享內存,修改新對象不會改到原對象。java
//深淺拷貝函數實現 function extend(obj1, deep){ //deep爲true,則遞歸調用extend函數進行深拷貝 var obj = (obj1 instanceof Array ? [] : {}) for(var key in obj1){ var value = obj1[key] obj[key] = (!!deep && value !== null && typeof value === "object") ? extend(value, deep) : value } return obj } var obj = { a: "hello", b:{ a: "world", b: 21 }, c:["Bob", "Tom", "Jenny"], d:function() { alert("hello world"); } } var objCopy = extend(obj, true) JSON.parse(JSON.stringify(obj)) //利用JSON的序列化和反序列化,沒法對函數類型進行拷貝; //undefined、function、symbol 會在轉換過程當中被忽略 另外concat和slice兩個數組方法均可以返回一個修改後的新數組,能夠對單層的數組進行拷貝;Object.assign()和... 展開運算符也相似。