JS淺轉殖和深轉殖

2021-10-24 13:50:31 字數 984 閱讀 3066

為什麼會有轉殖這麼個玩意呢?

上**:

var a = [1,2,3];

var b = a;

a[1] = 4;

console.log(b[1]); // 4

這就是我們為什麼提到轉殖的原因。我只不過改了a陣列的內容,怎麼b陣列的內容也跟著一起變了嘞?這裡需要知道a和b在棧和堆中的儲存情況

大概說下,陣列的內容是儲存在堆中的,而a和b不過是作為乙個引用(也可以參考c語言的指標)指向了陣列內容的儲存位址,上面var b = a;只不過是將a引用賦值給了b,並不是將陣列內容拷貝乙份出來,然後讓b指向新拷貝出來的陣列內容。所以a或者b修改陣列內容,其實都是修改的同乙個。

又因為基本變數(js的原始值undefined,null,number,string,boolean型別)一般都會直接放在棧中,因此轉殖只針對物件、陣列、函式等複雜資料。

淺轉殖

上面例子就是淺轉殖,說白了就是只複製引用位址,不複製內容。實現方法如上例子。

深轉殖

那當然就是連同內容一起複製啦。

function deepclone(val) 

var result = {};

for (var i in val)

return result;

}

將剛才那個例子中修改一下

var a = [1,2,3];

var b = deepclone(a);

a[1] = 4;

console.log(b[1]); // 2

總結深淺轉殖只要理解了堆疊其實就是這麼一回事的東西

JS(深轉殖和淺轉殖)

1 區別 淺轉殖是複製物件的指標位址,而不是物件本身,新舊物件共享同一塊記憶體。深轉殖是另外創造乙個一模一樣的物件,新舊物件不再共享記憶體,修改新物件不會改到原物件。2 1 淺轉殖 var liming function cloned obj for var key in obj return ne...

js 轉殖 淺轉殖 深轉殖)

淺轉殖var obj var obj1 function clone origin,target return target clone obj,obj1 obj1.name ge console.log obj1.name ge console.log obj.name chen obj1.car...

轉殖,深轉殖和淺轉殖

轉殖,深轉殖和淺轉殖。1.實現轉殖,繼承cloneable介面,實現clone beanutils.clonebean origin 2.深轉殖和淺轉殖的區別,淺轉殖指的是轉殖的時候僅僅轉殖物件本身 物件的基本變數 而不拷貝物件的引用變數。深轉殖指的是轉殖的時候不僅轉殖物件本身,而且拷貝物件包含的引...