標籤:修改 define 記憶體位址 log 也會 array string 他也 個數
js中有兩種資料類型:
1. 基本類型 : Number、String、Boolean、Null、Undefined
2. 複雜類型 : Object 、Array
深拷貝和淺拷貝只針對複雜類型的資料,因為基本類型資料的定義都會重新開闢新的記憶體。
淺拷貝拷貝的是記憶體位址,只是增加一個指標指向已有的記憶體,這時多個資料共用一個記憶體空間;深拷貝是新增了指標並且新開闢了記憶體空間,新指標指向新的記憶體。
淺拷貝:
var a={
name:‘WangJing‘,
sex:‘女‘,
age:‘25‘
};
var b = a ;
b.name = ‘白子畫‘;
console.log(a.name); //白子畫--------------淺拷貝:拷貝的是記憶體位址,指標指向同一個記憶體空間,修改其中一個其他也會改變
修改對象b的屬性值,對象a的屬性值也會改變,這就是淺拷貝 (數組也是一樣)
深拷貝:
var c = {}; //不要寫 var c; 會報錯
function extend(a,b){
for(var prop in a){
b[prop]=a[prop];
}
}
extend(a,c);
c.name = "胡歌";
console.log(a.name); //白子畫 --------------深拷貝:建立記憶體,新指標指向新的記憶體空間 修改其中一個不會影響另外的資料
以下代碼可以解決深拷貝
function extend(a, b) {for(var prop in a) {//判斷是否是基礎資料型別 (Elementary Data Type)if(typeof a[prop] === "object") {b[prop] = (a[prop].constructor === Array) ? [] : {};//對象和數組區別處理extend(a[prop], b[prop]);} else {b[prop] = a[prop];}}}
javaScript之深拷貝與淺拷貝