除了基本型別跟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
javascript 中物件的引用
在開發專案的乙個功能時 大量的運用了 物件 也發現了很多物件的引用引發的問題 問題1 物件賦值 物件位址的引用 var array 1,2,3,4 var ar array 去操作ar陣列時 array也會變化 問題2 物件中的物件 位址引用 var array 1,2,3,4 var ar 改變物...
javascript原始值和物件引用
一句話來說 原始值是不可變的,而物件引用是可變的。js中的原始值 undefined null 布林值 數字和字串 與物件 包括陣列和函式 有著本質的區別。原始值是不可更改的,任何方法都無法更改乙個原始值 對於字串來說,字串中所有的方法看上去返回了乙個修改後的字串,實際上返回的是乙個新的字串值 va...
JavaScript 引用型別
在js中,數值 布林值 null和undefined屬於基本型別,而物件 陣列和函式屬於引用型別。該博文要解決的兩個問題是 author 獵空de date 2012 3 8 ext.onready function test data var obj var arr obj obj.age 23 ...