js淺拷貝和深拷貝

2021-09-27 04:16:05 字數 1544 閱讀 4041

只複製物件的引用位址,兩個物件指向同乙個記憶體位址,所以修改其中任意乙個的值,另乙個也會隨之改變,這就是淺拷貝。

1.賦值

var m = 

var n = m;

n.a=15;

console.log(m.a)//15

m.a會輸出15,因為這是淺拷貝,n和m指向的是同乙個堆,物件複製只是複製的物件的引用。

2.遍歷物件,複製屬性。

var dog = 

},speak: 'load',

color: 'red',

}var arr1 = {};

function cope(obj)

return arr1;

}var arr2 = cope(dog);

arr2.run.fast = 'pink';

console.log(dog.run.fast); //pink

將物件和值複製過來,兩個物件修改其中任意乙個的值,另乙個不會改變,這就是深拷貝。

1.遞迴複製

var dog = 

},speak: 'load',

color: 'red',

}function deepcope(obj) ;

//遍歷物件

for (var i in obj) else }}

return arr1;

}var arr2 = deepcope(dog);

arr2.run='pink';//改變其中乙個的屬性,另乙個不會改變。

console.log(dog.run);//object

console.log(arr2===dog) //false

2.josn

用json.stringify把物件轉成字串,再用json.parse把字串轉成新的物件

(函式不可以)

var dog = 

},speak: 'load',

color: 'red',

}var a = json.parse(json.stringify(dog));

a.run='pink'; //改變其中乙個的屬性,另乙個不會改變。

console.log(dog.run);

console.log(a===dog) //false

3.jquery

var dog = 

},speak: 'load',

color: 'red',

}var a = $.extend(true, {}, dog);

a.run = 'pink'; //改變其中乙個的屬性,另乙個不會改變。

console.log(dog.run);

console.log(a===dog) //false

JS深拷貝和淺拷貝

js中物件分為基本型別和復合 引用 型別,基本型別存放在棧記憶體,復合 引用 型別存放在堆記憶體中 堆記憶體中用於存放由new建立的物件,棧記憶體存放一些基本型別的變數和物件的引用變數 對於簡單變數,記憶體小,直接複製不會發生引用 var a 123 var b a a 123456 console...

JS淺拷貝和深拷貝

1.淺拷貝 copy var obj1 物件存放於堆記憶體中,物件中的鍵值對,值可以為物件,可以為陣列.var obj2 obj1 物件,陣列之間只有引用賦值 obj2.name 撒哈哈 當改動物件obj2的時候,obj1的key對應的value也會更改這是淺拷貝 深拷貝 var obj1 var ...

js深拷貝和淺拷貝

走在前端的大道上 var m var n m n.a 15 這時m.a的值是多少 m.a會輸出15,因為這是淺拷貝,n和m指向的是同乙個堆,物件複製只是複製的物件的引用。深拷貝和上面淺拷貝不同,就是徹底copy乙個物件,而不是copy物件的引用,例如,還是之前的例子,我們這麼寫 var m var ...