新聞中心
在JavaScript中,拷貝對(duì)象是一個(gè)常見的操作,根據(jù)拷貝的深度,我們可以將拷貝分為淺拷貝和深拷貝。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供瑤海企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為瑤海眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
淺拷貝:創(chuàng)建一個(gè)新對(duì)象,這個(gè)對(duì)象有著原始對(duì)象屬性值的一份精確拷貝,如果屬性是基本類型,拷貝的就是基本類型的值;但如果屬性是引用類型,拷貝的就是內(nèi)存地址(即引用)的一份拷貝,如果其中一個(gè)對(duì)象改變了引用類型的屬性,另一個(gè)對(duì)象的該屬性也會(huì)受到影響。
深拷貝:創(chuàng)建一個(gè)新對(duì)象,和原始的對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)影響原始對(duì)象,反之亦然。
接下來,我會(huì)詳細(xì)解釋如何在JavaScript中進(jìn)行淺拷貝和深拷貝。
淺拷貝
1. Object.assign() 方法
Object.assign() 方法用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象,它將返回目標(biāo)對(duì)象。
let obj1 = { a: 1, b: 2, c: { d: 3 } };
let obj2 = Object.assign({}, obj1);
obj2.c.d = 4;
console.log(obj1.c.d); // 輸出 4,因?yàn)?obj2.c 和 obj1.c 指向同一個(gè)對(duì)象
2. 擴(kuò)展運(yùn)算符
擴(kuò)展運(yùn)算符(…)允許一個(gè)表達(dá)式在某處展開,當(dāng)用于對(duì)象時(shí),它會(huì)生成由對(duì)象的所有可枚舉鍵值對(duì)組成的數(shù)組。
let obj1 = { a: 1, b: 2, c: { d: 3 } };
let obj2 = { ...obj1 };
obj2.c.d = 4;
console.log(obj1.c.d); // 輸出 4,因?yàn)?obj2.c 和 obj1.c 指向同一個(gè)對(duì)象
深拷貝
1. JSON.parse() 和 JSON.stringify()
這是最簡(jiǎn)單的深拷貝實(shí)現(xiàn)方式,但它有局限性,例如不能處理函數(shù)和循環(huán)引用。
let obj1 = { a: 1, b: 2, c: { d: 3 } };
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.c.d = 4;
console.log(obj1.c.d); // 輸出 3,因?yàn)?obj2.c 是 obj1.c 的一個(gè)全新副本
2. 遞歸方法
通過遞歸遍歷對(duì)象的所有屬性,如果屬性值是對(duì)象,則遞歸調(diào)用深拷貝函數(shù)。
function deepClone(obj, hash = new WeakMap()) {
if (obj instanceof RegExp) return new RegExp(obj);
if (obj instanceof Date) return new Date(obj);
if (obj === null || typeof obj !== 'object') return obj;
if (hash.has(obj)) return hash.get(obj);
const result = Array.isArray(obj) ? [] : {};
hash.set(obj, result);
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
result[key] = deepClone(obj[key], hash);
}
}
return result;
}
let obj1 = { a: 1, b: 2, c: { d: 3 } };
let obj2 = deepClone(obj1);
obj2.c.d = 4;
console.log(obj1.c.d); // 輸出 3,因?yàn)?obj2.c 是 obj1.c 的一個(gè)全新副本
3. Lodash 庫的 _.cloneDeep() 方法
Lodash 是一個(gè)提供了一致性、自定義性、性能和實(shí)用性的工具庫,它的 _.cloneDeep() 方法可以用于創(chuàng)建對(duì)象的深拷貝。
const _ = require('lodash');
let obj1 = { a: 1, b: 2, c: { d: 3 } };
let obj2 = _.cloneDeep(obj1);
obj2.c.d = 4;
console.log(obj1.c.d); // 輸出 3,因?yàn)?obj2.c 是 obj1.c 的一個(gè)全新副本
在進(jìn)行深拷貝時(shí),選擇哪種方法取決于具體需求和場(chǎng)景,簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)可以使用 JSON.parse() 和 JSON.stringify(),而復(fù)雜的數(shù)據(jù)結(jié)構(gòu)可能需要使用遞歸方法或第三方庫如 Lodash。
名稱欄目:js深拷貝淺拷貝怎么操作
文章出自:http://www.5511xx.com/article/dhodjeg.html


咨詢
建站咨詢
