岳陽(yáng)網(wǎng)格員國(guó)際站seo優(yōu)化是什么意思
一:什么淺拷貝:
淺拷貝創(chuàng)建一個(gè)新對(duì)象,然后將原始對(duì)象的所有屬性值復(fù)制到新對(duì)象中。這意味著,如果原始對(duì)象的屬性值是基本類型(例如數(shù)字、字符串),那么這些值會(huì)被直接復(fù)制到新對(duì)象中。但如果屬性值是引用類型(例如對(duì)象或數(shù)組),則新對(duì)象中的屬性仍然引用原始對(duì)象中相同的引用。有一個(gè)原始對(duì)象如下
let originObj= {a: 1,b: 2,c: {d: 4}
}
淺拷貝代碼如下:
let result = {};
for(let key in originObj){result[key] = originObj[key]
}
這樣就實(shí)現(xiàn)了一個(gè)淺拷貝,此時(shí) result 和 originObj 沒(méi)有指向同一個(gè)對(duì)象,但是 result.c 和 originObj.c 是指向的同一個(gè)對(duì)象。
同樣能達(dá)到淺拷貝常見(jiàn)的還有擴(kuò)展運(yùn)算符、Object.assign等方法,如下:
let result1 = {...originObj};
let result2 = Object.assign({},originObj)
二:什么是深拷貝
深拷貝創(chuàng)建一個(gè)新對(duì)象,并遞歸地復(fù)制原始對(duì)象的所有層級(jí),包括嵌套的對(duì)象和數(shù)組。這意味著新對(duì)象和原始對(duì)象是完全獨(dú)立的,對(duì)新對(duì)象的修改不會(huì)影響原始對(duì)象,反之亦然。
如果對(duì)象里面不存在正則表達(dá)式、函數(shù)等特殊值,可以直接使用 JSON.parse(JSON.stringify(obj)) 方法,直接轉(zhuǎn)成JSON字符串再轉(zhuǎn)換回來(lái),就可以實(shí)現(xiàn)深拷貝。
也可以通過(guò)一些第三方的庫(kù)實(shí)現(xiàn),比如lodash的cloneDeep方法。
當(dāng)然也可以自己寫(xiě)一個(gè)深拷貝的方法,這里提供一個(gè)比較簡(jiǎn)單的方法
function deepClone(obj, hash = new WeakMap()) {if (obj === null || typeof obj !== 'object') {return obj;}if (hash.has(obj)) {return hash.get(obj);}const cloneObj = Array.isArray(obj) ? [] : {};hash.set(obj, cloneObj);for (let key in obj) {if (obj.hasOwnProperty(key)) {cloneObj[key] = deepClone(obj[key], hash);}}return cloneObj;
}
三:總結(jié)
-
淺拷貝: 只復(fù)制對(duì)象的一層,對(duì)于引用類型的屬性,復(fù)制的是引用而不是值。修改拷貝后的對(duì)象可能會(huì)影響原始對(duì)象。
-
深拷貝: 復(fù)制對(duì)象的所有層級(jí),包括嵌套對(duì)象和數(shù)組。新對(duì)象和原始對(duì)象是完全獨(dú)立的,修改一個(gè)不會(huì)影響另一個(gè)。
在實(shí)際應(yīng)用中,選擇深拷貝還是淺拷貝取決于具體的需求。深拷貝可能涉及到性能開(kāi)銷,特別是在處理大型對(duì)象或?qū)ο蟀h(huán)引用的情況下。因此,在選擇拷貝方式時(shí),需要根據(jù)項(xiàng)目的需求和性能考慮做出合適的選擇。