Object.assign()遇到的问题。

Object.assign(target, ...sources)

假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。例如:
var obj1 = {
a: 20,
b: {c: 2}
};
var copy = Object.assign({}, obj1);
此时,obj1.b 和 copy.b指向的还是一个同一个对象。

针对这种情况,有没有什么比较好的解决方案?


料青山看我应如是
浏览 574回答 1
1回答

梦里花落0921

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript