在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Object.assign()遇到的問題。

Object.assign()遇到的問題。

Object.assign(target, ...sources)

假如源對象的屬性值是一個指向?qū)ο蟮囊?,它也只拷貝那個引用值。例如:
var obj1 = {
a: 20,
b: {c: 2}
};
var copy = Object.assign({}, obj1);
此時,obj1.b 和 copy.b指向的還是一個同一個對象。

針對這種情況,有沒有什么比較好的解決方案?

回答
編輯回答
故林

Object.assign() 只是一級屬性復(fù)制,比淺拷貝多深拷貝了一層

標準(安全)JSON格式的對象深拷貝可以用這個:const obj1 = JSON.parse(JSON.stringify(obj));

我從《你不知道的 JavaScript》一書看到,工具函數(shù) JSON.stringify(..) 在將JSON對象序列化為字符串時也用到了 ToString 。請注意, JSON 字符串化并非嚴格意義上的強制類型轉(zhuǎn)換,因為其中也涉及 ToString 的相 關(guān)規(guī)則。
對大多數(shù)簡單值來說, JSON 字符串化和 果總是字符串:toString()的效果基本相同,只不過序列化的結(jié)

JSON.stringify( 42 ); // "42" 
JSON.stringify( "42" ); // ""42""(含有雙引號的字符串)
JSON.stringify( null ); // "null" 
JSON.stringify( true ); // "true" 

所有 安全的 JSONJSON-safe)都可以使用 JSON.stringify(..) 字符串化。 安全的 JSON 值是指能夠呈現(xiàn)為有效 JSON 格式的值。

下面敲黑板劃重點:

為了簡單起見, 我們來看看什么是 不安全的 JSON 值 。 undefinedfunction 、 symbol (ES6+)和包含循環(huán)引用(對象之間相互引用,形成一個無限循環(huán))的 對象 都不符合 JSON 結(jié)構(gòu)標準,支持 JSON 的語言無法處理它們。

JSON.stringify(..) 在對象中遇到 undefined 、 functionsymbol 時會自動將其忽略, 在數(shù)組中則會返回 null (以保證單元位置不變)。

例如:

JSON.stringify( undefined ); 
JSON.stringify( function(){} ); 
JSON.stringify( [1,undefined,function(){},4] ); 
JSON.stringify({ a:2, b:function(){} } ); // undefined // undefined 
// "[1,null,null,4]" // "{"a":2}" 

對包含循環(huán)引用的對象執(zhí)行 JSON.stringify(..) 會出錯。

具體的深拷貝我們可以參考一下 jQuery 的實現(xiàn)。

具體細節(jié)實現(xiàn)可以參考這篇文章。

JavaScript專題之從零實現(xiàn)jQuery的extend

2017年6月4日 19:44
編輯回答
薔薇花

lodash的cloneDeep 或者 JSON.stringify() JSON.parse()轉(zhuǎn)換一個新的對象得到的新對象就是會給分配一個新的內(nèi)存空間

2017年3月22日 20:02
編輯回答
乞許

Object.assign只是淺拷貝,要用深拷貝可以用lodash的cloneDeep
cloneDeep
或者自己寫一個遍歷對象深度clone的方法,隨便搜索都很多,就不貼代碼了。

2017年10月30日 20:11
編輯回答
扯不斷

如果是單層操作,可以使用擴展運算

var copy = {...obj1};

如果不用合并操作的話,可以直接使用字符串互轉(zhuǎn)即可

var copy = JSON.parse(JSON.stringify(obj1));
2018年6月16日 21:50