JS物件的引用,物件的拷貝

2021-09-02 02:02:40 字數 2153 閱讀 4248

除了基本型別跟null,物件之間的賦值,只是將位址指向同乙個,而不是真正意義上的拷貝

將乙個物件賦值給另外乙個物件。

var a = [1,2,3];

var b = a;

b.push(4); // b中新增了乙個4

alert(a); // a變成了[1,2,3,4]

自定義物件

var obj = ;

var obj2 = obj;

obj2.a = 20; // obj2.a改變了,

alert(obj.a); // 20,obj的a跟著改變

這就是由於物件型別直接賦值,只是將引用指向同乙個位址,導致修改了obj會導致obj2也被修改

為什麼以上例子沒有達到效果。

原因在於:

物件、陣列甚至函式,在賦值的時候都是引用傳遞的,傳遞是的位址,乙個指標。於是,新物件和原始物件使用了同乙個位址空間。所以我們修改新物件的屬性,實際上也在修改原始物件的屬性,甚至修改了所有引用這個位址的其它物件的屬性。

淺拷貝定義:

複製引用資料型別後,修改這個新物件的屬性值,不會影響原始物件的值,這就叫淺拷貝。

所以,我們需要封裝乙個函式,來對物件進行拷貝,通過for in 迴圈獲取基本型別,賦值每乙個基本型別,才能真正意義上的複製乙個物件

var obj = ;

function copy(obj);

for ( var attr in obj)

return newobj;

}var obj2 = copy(obj);

obj2.a = 20;

alert(obj.a); //10

這樣就解決了物件賦值的問題。

但是這裡存在隱患,如果obj中,a的值不是10,而是乙個物件,這樣就會導致在for in中,將a這個物件的引用賦值為新物件,導致存在物件引用的問題。

var obj = };

function copy(obj);

for ( var attr in obj)

return newobj;

}var obj2 = copy(obj);

obj2.a.b = 20;

alert(obj.a.b); //20

因此,由於這個copy物件只是對第一層進行拷貝,無法拷貝深層的物件,這個copy為淺拷貝,我們需要通過遞迴,來拷貝深層的物件。將copy改造成遞迴即可

var obj = };

function deepcopy(obj)

var newobj = {};

for ( var attr in obj)

return newobj;

}var obj2 = deepcopy(obj);

obj2.a.b = 20;

alert(obj.a.b); //10

//當然利用 object.assign 也能解決

2.  json物件形式亦闊以處理

let params = json.parse(json.stringify(this.form));
3.es6 的 object.assign 

let obj = ,obj2={}

object.assign(obj2,obj)

console.log(obj2) //

console.log(obj2 == obj) // false

只能做淺拷貝之用 也就是說 只能拷貝一層

4.es6 的解構方法 

let obj = 

let obj1 =

console.log(obj1) //

console.log(obj == obj1) //false

let aa = }

let bb =

bb.b.c = 22

console.log(aa.b.c) // 22

console.log(bb) // }

console.log(aa == bb) // false

//也只能拷貝一層之用

JS物件的引用,物件的拷貝

除了基本型別跟null,物件之間的賦值,只是將位址指向同乙個,而不是真正意義上的拷貝 將乙個物件賦值給另外乙個物件。var a 1,2,3 var b a b.push 4 b中新增了乙個4 alert a a變成了 1,2,3,4 自定義物件 var obj var obj2 obj obj2.a...

JS物件的引用,物件的拷貝

目錄除了基本型別跟null,物件之間的賦值,只是將位址指向同乙個,而不是真正意義上的拷貝 將乙個物件賦值給另外乙個物件。var a 1,2,3 var b a b.push 4 b中新增了乙個4 alert a a變成了 1,2,3,4 自定義物件 var obj var obj2 obj obj2...

JavaScript物件的引用,物件的拷貝

除了基本型別跟null,物件之間的賦值,只是將位址指向同乙個,而不是真正意義上的拷貝 將乙個物件賦值給另外乙個物件。var a 1,2,3 var b a b.push 4 b中新增了乙個4 alert a a變成了 1,2,3,4 自定義物件 var obj var obj2 obj obj2.a...