Object.assign(target, ...sources)
假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。例如:
var obj1 = {
a: 20,
b: {c: 2}
};
var copy = Object.assign({}, obj1);
此时,obj1.b 和 copy.b指向的还是一个同一个对象。
针对这种情况,有没有什么比较好的解决方案?
Object.assign(target, ...sources)
假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。例如:
var obj1 = {
a: 20,
b: {c: 2}
};
var copy = Object.assign({}, obj1);
此时,obj1.b 和 copy.b指向的还是一个同一个对象。
针对这种情况,有没有什么比较好的解决方案?
Object.assign只是浅拷贝,要用深拷贝可以用lodash的cloneDeep
cloneDeep
或者自己写一个遍历对象深度clone的方法,随便搜索都很多,就不贴代码了。
如果是单层操作,可以使用扩展运算
var copy = {...obj1};
如果不用合并操作的话,可以直接使用字符串互转即可
var copy = JSON.parse(JSON.stringify(obj1));
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
Object.assign()
只是一级属性复制,比浅拷贝多深拷贝了一层标准(安全)JSON格式的对象深拷贝可以用这个:
const obj1 = JSON.parse(JSON.stringify(obj))
;我从《你不知道的 JavaScript》一书看到,工具函数
JSON.stringify(..)
在将JSON对象序列化为字符串时也用到了ToString
。请注意,JSON
字符串化并非严格意义上的强制类型转换,因为其中也涉及ToString
的相 关规则。对大多数简单值来说,
JSON
字符串化和 果总是字符串:toString()
的效果基本相同,只不过序列化的结所有 安全的
JSON
值JSON-safe)
都可以使用JSON.stringify(..)
字符串化。 安全的JSON
值是指能够呈现为有效JSON
格式的值。下面敲黑板划重点:
JSON.stringify(..)
在对象中遇到undefined
、function
和symbol
时会自动将其忽略, 在数组中则会返回null
(以保证单元位置不变)。例如:
对包含循环引用的对象执行
JSON.stringify(..)
会出错。具体的深拷贝我们可以参考一下
jQuery
的实现。具体细节实现可以参考这篇文章。
JavaScript专题之从零实现jQuery的extend