JavaScript深拷貝和淺拷貝

1、JavaScript的數(shù)據(jù)類(lèi)型:基本數(shù)據(jù)類(lèi)型、引用數(shù)據(jù)類(lèi)型。

基本數(shù)據(jù)類(lèi)型:保存在棧內(nèi)存的簡(jiǎn)單數(shù)據(jù)段(undefined,boolean,number,string,null)。

引用數(shù)據(jù)類(lèi)型:Array,對(duì)象,F(xiàn)unction保存在堆內(nèi)存中。

淺拷貝:只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象共享一塊內(nèi)存

深拷貝:復(fù)制并創(chuàng)建一個(gè)一摸一樣的對(duì)象,不共享內(nèi)存,修改新對(duì)象,舊對(duì)象保持不變

2 、遞歸的方法實(shí)現(xiàn)深拷貝

functiondeepclone(obj){

? ? ? ? let objClone = Array.isArray(obj) ? [] : {};

? ? ? ? if (obj && typeof obj === "object") {

? ? ? ? ? ? for (key in obj) {

? ? ? ? ? ? ? ? //if (obj.hasOwnProperty(key)) {? //也可以不加??

????????????????????????if (obj[key] && typeof obj[key] === "object") {

? ? ? ? ? ? ? ? ? ? ? ? ????objClone[key] = deepclone(obj[key])

? ? ? ? ? ? ? ? ? ? ????} else {

? ? ? ? ? ? ? ? ? ? ? ? ????objClone[key] = obj[key]

? ? ? ? ? ? ? ? ? ????? }

? ? ? ? ? ? ? ? ????//}? ? ? ? ? ?

?????????????}

? ? ? ? }

? ? ? ? return objClone

? ? }

? ? var a = [1, 2, 3, 4];

? ? var b = deepclone(a);

? ? a[0] = 8? ? console.log(a, b);


Array.isArray(obj):ECMAScript 5.1 (ECMA-262)? ?考慮到的兼容性,可以用下面的方法實(shí)現(xiàn)較好的兼容

? ?if (!Array.isArray) {

? ? ? Array.isArray = function(arg) {

? ? ????????return Object.prototype.toString.call(arg) === '[object Array]';

? ? ? ?};

????}

3、用JSON.stringify把對(duì)象轉(zhuǎn)成字符串,再用JSON.parse把字符串轉(zhuǎn)成新的對(duì)象

functiondeepclone(obj){

? ? ? var _obj = JSON.stringify(obj);

? ? ? var cloneObj = JSON.parse(_obj);

? ? ? return cloneObj

? ? }

? ? var a =[1,2,3,4];

? ? var b= deepclone(a);

? ? a[0]=8? ? console.log(a,b);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容