1 回答
TA贡献1772条经验 获得超6个赞
Object.assign() 只是一级属性复制,比浅拷贝多深拷贝了一层
标准(安全)JSON格式的对象深拷贝可以用这个:const obj1 = JSON.parse(JSON.stringify(obj));
我从《你不知道的 JavaScript》一书看到,工具函数 JSON.stringify(..) 在将JSON对象序列化为字符串时也用到了 ToString 。请注意, JSON 字符串化并非严格意义上的强制类型转换,因为其中也涉及 ToString 的相 关规则。
对大多数简单值来说, JSON 字符串化和 果总是字符串:toString()的效果基本相同,只不过序列化的结
JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42""(含有双引号的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"
所有 安全的 JSON 值 JSON-safe)都可以使用 JSON.stringify(..) 字符串化。 安全的 JSON 值是指能够呈现为有效 JSON 格式的值。
下面敲黑板划重点:
为了简单起见, 我们来看看什么是 不安全的 JSON 值 。 undefined 、 function 、 symbol (ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的 对象 都不符合 JSON 结构标准,支持 JSON 的语言无法处理它们。
JSON.stringify(..) 在对象中遇到 undefined 、 function 和 symbol 时会自动将其忽略, 在数组中则会返回 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}"
对包含循环引用的对象执行 JSON.stringify(..) 会出错。
具体的深拷贝我们可以参考一下 jQuery 的实现。
具体细节实现可以参考这篇文章。
JavaScript专题之从零实现jQuery的extend
添加回答
举报