javaScript之深拷貝與淺拷貝
阿新 • • 發佈:2017-08-16
func array efi name 內存空間 數據 xtend 是否 --
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) { //判斷是否是基本數據類型 if(typeof a[prop] === "object") { b[prop] = (a[prop].constructor === Array) ? [] : {};//對象和數組區別處理 extend(a[prop], b[prop]); } else { b[prop] = a[prop]; } } }
javaScript之深拷貝與淺拷貝