米琪卡哇伊
2023-04-19 19:15:40
最近在寫程序的時(shí)候發(fā)現(xiàn),如果在函數(shù)參數(shù)中傳遞一個(gè)object對(duì)象,如果我在函數(shù)內(nèi)部改變了這個(gè)對(duì)象的字段值,那么這個(gè)對(duì)象也會(huì)隨之改變,看來(lái)對(duì)于對(duì)象來(lái)說(shuō)函數(shù)參數(shù)傳遞的是一個(gè)引用。那么js里是否有方便的clone對(duì)象方法呢?我好像沒(méi)有找到clone關(guān)鍵字支持,對(duì)象內(nèi)部也沒(méi)有clone方法,jQuery的$.clone方法也不能用在普通對(duì)象上,有這樣的方法嗎?
3 回答

縹緲止盈
TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
深拷貝需要考慮的因素非常多,比如
傳入的是普通的{}對(duì)象還是由構(gòu)造函數(shù)生成的對(duì)象
如果由構(gòu)造函數(shù)生成是否拷貝原型鏈上的屬性
處理循環(huán)引用(包括自身引用)
這里寫出一個(gè)基本的深拷貝方案。只處理基本的{}對(duì)象,同時(shí)也處理Array,RegExp,Date,并解決循環(huán)引用問(wèn)題。

飲歌長(zhǎng)嘯
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
可以使用 jQuery 中的 extend 方法。
var o = {a: [1]};//淺拷貝var o1 = $.extend({}, o);console.log(o1.a === o.a); // true//深拷貝var o2 = $.extend(true, {}, o);console.log(o2.a === o.a); //false

月關(guān)寶盒
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
JavaScript中對(duì)象拷貝分兩種,淺拷貝與深拷貝,這里你提到的是深拷貝。
對(duì)于一個(gè)普通的字面量對(duì)象,可以這樣簡(jiǎn)單拷貝:
function clone(myObj){ if(typeof(myObj) != 'object' || myObj == null) return myObj; var newObj = new Object(); for(var i in myObj){ newObj[i] = clone(myObj[i]); } return newObj; }
添加回答
舉報(bào)
0/150
提交
取消