沒有拷貝的情況
var obj = { a:10};var obj2 = obj;obj2.a = 20;alert(obj.a); ==> 20 //賦值操作會直接修改obj.a的值
JavaScript的深拷貝和淺拷貝
一、 JavaScript的淺拷貝
淺拷貝只會將對象的各個屬性進行依次複製,並不會進行遞迴複製,而 JavaScript 儲存物件都是存地址的,所以淺複製會導致 obj.arr 和 shallowObj.arr 指向同一塊記憶體位址
var obj = { a:10}function copy(obj){ var newObj = {}; for(var attr in obj){ newObj[attr] = obj[attr]; } return newObj;}var obj2 = copy(obj);obj2.a = 20;alert(obj.a); ==> 10
二、JavaScript的淺拷貝存在的問題
var obj = { a:{ b:10 }}function copy(obj){ var newObj = {}; for(var attr in obj){ newObj[attr] = obj[attr]; } return newObj;}var obj2 = copy(obj);obj2.a.b = 20;alert(obj.a.b); ==>20
JavaScript的深拷貝
一、深拷貝需要考慮遞迴的概念
深拷貝不僅將原對象的各個屬性逐個複製出去,而且將原對象各個屬性所包含的對象也依次採用深複製的方法遞迴複製到新對象上。這就不會存在上面 obj 和 shallowObj 的 arr 屬性指向同一個對象的問題。
// 遞迴函式(階乘)function digui(n){ if(n==1){ return 1; } return n*digui(n-1);}alert(digui(5));
二、深拷貝
var obj = { a:{ b:10 }}function deepCopy(obj){ if(typeof obj != 'object'){ return obj; } var newObj = {}; for(var attr in obj){ newObj[attr] = deepCopy(obj[attr]); } return newObj;}var obj2 = deepCopy(obj);obj2.a.b = 20;alert(obj.a.b); ==>10
JQuery的深拷貝和淺拷貝
$.extend在JQ中的深拷貝 和 淺拷貝
var a = {};
var b = { name : { age : 30 } };
淺拷貝
$.extend( a , b );
加入參數true後就是深拷貝
$.extend( true , a , b );