要了解其本質(zhì)區(qū)別,就需要了解堆和棧斋陪,值與引用的概念及區(qū)別
1.堆(stack)和棧(heap)
stack為自動(dòng)分配的內(nèi)存空間瘤运,它由系統(tǒng)自動(dòng)釋放;而heap則是動(dòng)態(tài)分配的內(nèi)存罩旋,大小不定也不會(huì)自動(dòng)釋放啊央。
2.值與引用
js中有基本數(shù)據(jù)類型和引用類型;
基本數(shù)據(jù)類型的變量和值都是存放在棧中涨醋,聲明之后會(huì)分配一塊內(nèi)存區(qū)域瓜饥,基本數(shù)據(jù)類型之間的賦值是直接把棧內(nèi)存中存的值賦值給變量(傳值)
引用類型的變量存在棧中,但值是存在堆中浴骂,實(shí)際上棧存放的是指向堆中的地址乓土,也叫引用,引用類型直接的賦值實(shí)質(zhì)是把引用賦值給一個(gè)變量(傳址)溯警,所以其指向的堆內(nèi)存中的值是一樣的
3.深拷貝和淺拷貝
深拷貝和淺拷貝的使用場(chǎng)景是在復(fù)雜對(duì)象里趣苏,即對(duì)象的屬性還是對(duì)象,
淺拷貝是指只復(fù)制一層對(duì)象愧膀,當(dāng)對(duì)象的屬性是引用類型時(shí)拦键,實(shí)質(zhì)復(fù)制的是其引用,當(dāng)引用指向的值改變時(shí)也會(huì)跟著變化
例如:
var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
//當(dāng)一個(gè)對(duì)象屬性的引用值改變時(shí)將導(dǎo)致另一個(gè)也改變
shallowObj.arr[1] = 5;
obj.arr[1] // = 5
深拷貝是指復(fù)制對(duì)象的所有層級(jí)檩淋,實(shí)現(xiàn)方法
(1)通過(guò)遞歸實(shí)現(xiàn)
deepCopy(o) {
if (o instanceof Array) {
let n = [];
for (let i = 0; i < o.length; ++i) {
n[i] =deepCopy(o[i]);
}
return n;
} else if (o instanceof Object) {
let n = {}
for (let i in o) {
n[i] = deepCopy(o[i]);
}
return n;
} else {
return o;
}
}
//遞歸另一種寫法
var deepCopy= function(source) {
var result={};
for (var key in source) {
result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
}
return result;
}
(2)通過(guò)JSON解析實(shí)現(xiàn)
//把一個(gè)對(duì)象轉(zhuǎn)成json字符串在轉(zhuǎn)成json對(duì)象
JSON.parse(JSON.stringify(o))