JS當中的拷貝!!!

2021-08-07 06:36:35 字數 2186 閱讀 1333

**最近在複習前端的筆試和面試題目,看到了深拷貝和淺拷貝的問題,

在這裡自己查點資料寫下這一篇部落格用來複習!**

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...