1. 程式人生 > >javaScript之深拷貝與淺拷貝

javaScript之深拷貝與淺拷貝

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之深拷貝與淺拷貝