JS(深轉殖和淺轉殖)

2022-07-10 09:27:11 字數 1849 閱讀 7938

1 區別

淺轉殖是複製物件的指標位址,而不是物件本身,新舊物件共享同一塊記憶體。

深轉殖是另外創造乙個一模一樣的物件,新舊物件不再共享記憶體,修改新物件不會改到原物件。

2-1 淺轉殖

var liming = 

}function cloned(obj) ;

for (var key in obj)

return newobj

}var liming2 = cloned(liming);

// 因原資料的第一層資料為基本資料型別,改變 liming2.name中的值時,不會使liming物件中的原資料一同改變

liming2.name = "koby";

// 因原資料中包含子物件,改變liming2.addresd.area中的值時,會使liming物件中的原資料一同改變

liming2.addresd.area = "荔灣區";

console.log('liming', liming.name);//liming dongdong

console.log('liming2', liming2.name);//liming2 koby

console.log('liming', liming.addresd.area);//liming 荔灣區

console.log('liming2', liming2.addresd.area);//liming2 荔灣區

2-2 深轉殖

方法

// 當object只有一層的時候,是深拷貝

let obj1 = ;

let obj2 = object.assign({}, obj1);

obj2.username = 'yiyi';

console.log(obj1);

console.log(obj2);

// 當object有兩層的時候,是淺拷貝

var obj3 =

};var initalobj = object.assign({}, obj3);

initalobj.city = "china";

initalobj.a.age = "40";

console.log('obj3', obj3);

console.log('initalobj', initalobj)

//json方法實現深轉殖

var obj3 = ,

friends: ["小華", "小公尺"]

}let newobj = json.stringify(obj3);

let result = json.parse(newobj);

console.log(newobj);

console.log(result);

2-3 手寫實現深轉殖

// 手寫深轉殖函式

var obj1 = ,

friends: ["小莉", "小公尺"]

}function cloned(obj)

if (object.prototype.tostring.call(obj) === "[object array]")

var newobj = {};

for (var key in obj)

// 如原物件當前屬性為引用型別

else

}return newobj

}var obj2 = cloned(obj1);

obj2.addresd.area = '黃浦區';

console.log('obj1', obj1);

console.log('obj2', obj2);

JS淺轉殖和深轉殖

為什麼會有轉殖這麼個玩意呢?上 var a 1,2,3 var b a a 1 4 console.log b 1 4 這就是我們為什麼提到轉殖的原因。我只不過改了a陣列的內容,怎麼b陣列的內容也跟著一起變了嘞?這裡需要知道a和b在棧和堆中的儲存情況 大概說下,陣列的內容是儲存在堆中的,而a和b不過...

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.深轉殖和淺轉殖的區別,淺轉殖指的是轉殖的時候僅僅轉殖物件本身 物件的基本變數 而不拷貝物件的引用變數。深轉殖指的是轉殖的時候不僅轉殖物件本身,而且拷貝物件包含的引...