**最近在複習前端的筆試和面試題目,看到了深拷貝和淺拷貝的問題,
在這裡自己查點資料寫下這一篇部落格用來複習!**
var name = 'jozo';
var city = 'guangzhou';
var age = 22;
它們在記憶體中是這樣的
引用型別的儲存需要記憶體的棧區和堆區(堆區是指記憶體裡的堆記憶體)共同完成,棧區記憶體儲存變數識別符號和指向堆記憶體中該物件的指標
var person1 = ;
var person2 = ;
var person3 = ;
它們在記憶體中是這樣的:
ok!知道了這兩種型別,下面我們就開始正題!!!
首先說一下什麼是拷貝吧,很好理解就是類似於我們電腦中複製貼上這麼乙個操作
為什麼要拷貝?因為引用型別的儲存需要記憶體的棧區和堆區(堆區是指記憶體裡的堆記憶體)共同完成,棧區記憶體儲存變數識別符號和指向堆記憶體中該物件的指標**
1.對於值型別的拷貝
這個很好理解直接上**
var a=10;
b=a//直接賦值就行了
2.對於引用型別的拷貝2.1首先是對陣列的拷貝
//對陣列的拷貝可以用slice或者concat
var arr = ["one", "two", "three"];
//var arrto=arr.slice(0);
var arrto = arr.concat();
arrto[1] = "test";
console.log(arr)
console.log(arrto);
2.2對物件的拷貝2.2.1淺拷貝(適用於簡單物件)
//對物件的拷貝------------淺拷貝
var obj = ;
function
copy
(obj) ;
for(key in obj)
return newobj;
}obj2 = copy(obj);
console.log(obj2.a); //成功複製出obj的a
obj2.a = 555; //更改了obj2的a
console.log(obj2.a); //改變
console.log(obj.a); //不變,obj2的改變不影響obj,說明拷貝後的物件和之前的物件不存在公用乙個引用
如上所示,淺拷貝可以幫我們完成很大一部分日常需要了,但是對於複雜一點的物件卻無法深入!比如對於
var obj=,
b:20
};
這樣的物件,我們使用淺拷貝是不行的
2.2.2深拷貝
var obj=,
b:11
};function
deepcopy
(obj)
var newobj={};
for(var i in obj)
return newobj;
}var obj2=deepcopy(obj);
console.log(obj.a.aa);//10
console.log(obj2.a.aa);//10 成功複製深層物件aa
obj2.a.aa=22; //改變obj2的a的aa
console.log(obj2.a.aa);// 改變
console.log(obj.a.aa);//10 不變
這裡我們看到,其實深拷貝主要就是淺拷貝的遞迴!(必須加入遞迴終止條件) 你知道js當中for迴圈當中的bug嗎,如何解決它
本來以為for迴圈可以很好的解決一切問題,直到今天遇到了這段 重新整理了我對for迴圈的認識,話不多說,直接上 var arr for var i 0 i 10 i arr 3 大家看上面這段 我先宣告了乙個空陣列,然後把它放在迴圈裡面,迴圈新增函式作為arr陣列的資料,第一印象看到的時候,肯定不少...
js 當中的apply與call
例如當我們執行 乙個方法 知乎上面鏈結位址 var numbers 5,6,2,3,7 var s wujianglong var s1 wu jiang long s.split w u j i a n g l o n g s1.split vm418 1 uncaught typeerror s...
js當中的相容問題
1.關於獲取行外樣式 currentstyle 和 getcomputedstyle 出現的相容性問題 我們都知道js通過style不可以獲取行外樣式,當我們需要獲取行外樣式時 我們一般通過這兩個方法獲取行外樣式 ie下 currentstyle chrome,ff下 getcomputedstyl...