溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript深拷貝實現(xiàn)的方式有哪些

發(fā)布時間:2022-07-07 09:43:16 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“javascript深拷貝實現(xiàn)的方式有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“javascript深拷貝實現(xiàn)的方式有哪些”吧!

概念介紹

深拷貝:在堆內(nèi)存中重新開辟一個存儲空間,完全克隆一個一模一樣的對象 淺拷貝:不在堆內(nèi)存中重新開辟空間,只復制棧內(nèi)存中的引用地址。本質(zhì)上兩個對象(數(shù)組)依然指向同一塊存儲空間

第一種:遞歸方式(推薦,項目中最安全最常用)

使用遞歸的方式進行對象(數(shù)組)的深拷貝

奉上已封裝的深拷貝函數(shù)????

	//函數(shù)拷貝
    const copyObj = (obj = {}) => {
    		//變量先置空
            let newobj = null;  
            //判斷是否需要繼續(xù)進行遞歸
            if (typeof (obj) == 'object' && obj !== null) {
                newobj = obj instanceof Array ? [] : {};
                //進行下一層遞歸克隆
                for (var i in obj) {
                    newobj[i] = copyObj(obj[i])
                }
                //如果不是對象直接賦值
            } else newobj = obj;
            return newobj;    
        }

上方函數(shù)的使用方式????

//模擬對象
let obj = {
	numberParams:1,
	functionParams:() => {
		console.log('昨天基金全是綠的,只有我的眼睛是紅的');
	},
	objParams:{
		a:1,
		b:2
	}
}
const newObj = copyObj(obj); //這樣就完成了一個對象的遞歸拷貝
obj.numberParams = 100;  //更改第一個對象的指
console.log(newObj.numberParams); //輸出依然是1 不會跟隨obj去改變

第二種:JSON.stringify() ;(這個不推薦使用,有坑)

這個方法有坑,詳細講解請看我另一篇文章 “使用JSON.stringify進行深拷貝的坑” 以下是代碼示例

let obj = {
	a:1,
	b:"基金虧太多,終有一天,你站上了天臺,我臥上了軌道。來生我們有說有笑。"
}
//先轉(zhuǎn)為json格式字符,再轉(zhuǎn)回來
let newObj = JSON.parse(JSON.stringify(obj));
obj.a = 50;
console.log(newObj.a); //輸出 1

普通的對象也可以進行深拷貝,但是?。。?當對象內(nèi)容項為number,string.boolean的時候,是沒有什么問題的。但是,如果對象內(nèi)容項為undefined,null,Date,RegExp,function,error的時候。使用JSON.stringify()進行拷貝就會出問題了。 詳細講解請查看我的另一篇文章“使用JSON.stringify()進行深拷貝的坑”

第三種:使用第三方庫lodash中的cloneDeep()方法

是否推薦使用,看情況吧。如果我們的項目中只需要一個深拷貝的功能,這種情況下為了一個功能引入整個第三方庫就顯得很不值得了。不如寫一個遞歸函數(shù)對于項目來說性能更好。

lodash.cloneDeep()代碼示例????

import lodash from 'lodash';
let obj = {
	a: {
	    c: 2,
	    d: [1, 3, 5],
	    e:'阿巴阿巴'
	  },
	  b: 4
}
const newObj = lodash.cloneDeep(obj);
obj.b = 20;
console.log(newObj.b); //輸出 4; 不會改變

實際上,cloneDeep()方法底層使用的本來就是遞歸方法。只是在外層又封裝了一層而已。

所以,如果不是原先項目中有使用 lodash 這個庫的話,大可不必為了這一個功能而去引入它。

文章上方有提供進行深拷貝的函數(shù),推薦使用。大家可自取。

第四種:JQuery的extend()方法進行深拷貝(推薦在JQ中使用)

這個方法僅適用于JQuery構(gòu)建的項目。 JQuery自身攜帶的extend()方法可以進行深拷貝,不用自己寫遞歸也不用引入第三方庫還沒什么坑。

在JQuery項目中的使用方式????

let obj = {
	a: {
	    c: 2,
	    d: [1, 3, 5],
	    e:'阿巴阿巴'
	  },
	  b: 4
}
let newObj= $.extend(true, {}, obj1);  //拷貝完成
obj.b = 20;
console.log(newObj.b); //輸出 4

到此,相信大家對“javascript深拷貝實現(xiàn)的方式有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI