1 回答

TA貢獻1772條經(jīng)驗 獲得超6個贊
Object.assign() 只是一級屬性復(fù)制,比淺拷貝多深拷貝了一層
標(biāo)準(zhǔn)(安全)JSON格式的對象深拷貝可以用這個:const obj1 = JSON.parse(JSON.stringify(obj));
我從《你不知道的 JavaScript》一書看到,工具函數(shù) JSON.stringify(..) 在將JSON對象序列化為字符串時也用到了 ToString 。請注意, JSON 字符串化并非嚴(yán)格意義上的強制類型轉(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"
所有 安全的 JSON 值 JSON-safe)都可以使用 JSON.stringify(..) 字符串化。 安全的 JSON 值是指能夠呈現(xiàn)為有效 JSON 格式的值。
下面敲黑板劃重點:
為了簡單起見, 我們來看看什么是 不安全的 JSON 值 。 undefined 、 function 、 symbol (ES6+)和包含循環(huán)引用(對象之間相互引用,形成一個無限循環(huán))的 對象 都不符合 JSON 結(jié)構(gòu)標(biāo)準(zhǔn),支持 JSON 的語言無法處理它們。
JSON.stringify(..) 在對象中遇到 undefined 、 function 和 symbol 時會自動將其忽略, 在數(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
添加回答
舉報