淺拷貝:拷貝的是引用,當引用的值改變時,另外乙個也會跟著改變;
淺拷貝新舊物件還是共享同一塊記憶體,改變其中乙個,另乙個也會受影響,這樣修改,會失去原始資料。
深拷貝:複製出乙個全新的物件例項,新物件跟原物件不共享記憶體,兩者操作互不影響
深拷貝和淺拷貝的使用場景是在複雜物件裡,複雜資料型別裡:object,array,funtion
1,object.assign
es6中拷貝物件的方法,接受的第乙個引數是拷貝的目標target,剩下的引數是拷貝的源物件sources(可以是多個)
let target ={};let source =
}object.assign(target,source);
console.log(target);
//}
object.assign使用注意事項:
let copy2 = object.assign({}, )
let array = [,]let array1 = array.slice(0);
console.log(array1)
slice:從已有的陣列中返回選定的元素
let obj = }let obj2 =
console.log(obj2)
參考:二,實現深拷貝
//1. josn.stringify()/json.parse()
let obj = }
json.parse(json.stringify(obj)) //
2. 遞迴拷貝
function
deepclone(obj)
for (let i in
obj)
} return
copy
}
三,實現深淺拷貝
//淺拷貝實現
function
shallowcopy(obj)
for (var prop in
obj)
}return
dst }
var obj =
var shallowobj =shallowcopy(obj)
console.log(shallowobj.arr[1])
shallowobj.arr[1] = 5;
console.log(obj.arr[1])
//賦值
let a =
let b =a;
b.name = 22;
console.log(a)
//淺拷貝
//深拷貝:拷貝例項
function
deepcopy(obj)
return
n; }
else
if (obj instanceof
object) ;
for (let i in
obj)
return
n; }
else
}var obj2 =
var deepobj =deepcopy(obj2)
console.log('深拷貝', deepobj.arr[0])
deepobj.arr[1] = 6;
console.log('深拷貝' + obj2.arr[0])
//深拷貝:通過json解析實現
//把乙個物件轉成json字串在轉成json物件
let obj3 =
json.parse(json.stringify(obj3))
//參考:
js的深拷貝淺拷貝的實現方法
首先深拷貝淺拷貝是基於堆的引用型別。一 在棧中儲存字串 數字 布林值以及指向堆的位址等確定的固定值 使用另乙個變數d等於a,相當於d拷貝了a 在棧記憶體中開闢了乙個新空間d 棧中a和d兩個已經是互不相干變數,無論另乙個值怎麼變化都不會對其他值造成影響 二 堆中儲存函式 陣列 物件,這些可以新增,減少...
實現淺拷貝與深拷貝
js包含基本資料型別與引用資料型別兩種不同的資料型別的值,深拷貝與淺拷貝的概念只存在於引用資料型別。對於引用型別,淺拷貝是拷貝了指向這個物件堆記憶體的指標,是拷貝了對原物件引用,深拷貝是拷貝了該物件的所有屬性到乙個新的物件,若是原物件的某屬性依然引用了其他物件,那麼需要將原物件引用的其他物件一併進行...
JS中淺拷貝和深拷貝的使用,深拷貝實現方法總結
1 淺拷貝 兩個物件經過拷貝後雖然具有相同的屬性,但是他們都指向同乙個記憶體空間。操作會引起引用,同一位址的變數一起改變。let a let b a b.x 2 console.log b console.log a 2 深拷貝 兩個物件除了拷貝了一樣的屬性,沒有任何其他關聯 指向不同的記憶體空間 ...