JavaScript并没有提供对象的复制方法,只能借助第三方库或自己实现对象的深度克隆。具体方法如下:
第三方库实现
实现JavaScript库的深度克隆的第三方库主要有:
- Underscore —— _.clone()
- jQuery —— $.clone() / $.extend()
- lodash —— _.clone() / _.cloneDeep()
- 借助 JSON 全局对象
Underscore —— _.clone()
在 Underscore 中有这样一个方法:_.clone(),这个方法实际上是一种浅复制 (shallow-copy),所有嵌套的对象和数组都是直接复制引用而并没有进行深复制。其代码如下:
1 | // Create a (shallow-cloned) duplicate of an object. |
jQuery —— $.clone() / $.extend()
在 jQuery 中也有这么一个叫 $.clone() 的方法,可是它并不是用于一般的 JS 对象的深复制,而是用于 DOM 对象。与 Underscore 类似,可以通过 $.extend() 方法来完成深复制。值得庆幸的是,在 jQuery 中可以通过添加一个参数来实现递归extend。调用$.extend(true, {}, …)就可以实现深复制。
1 | var x = { |
lodash —— _.clone() / _.cloneDeep()
在lodash中关于复制的方法有两个,分别是.clone()和.cloneDeep()。其中.clone(obj, true)等价于.cloneDeep(obj)。
借助 JSON 全局对象
针对纯 JSON 数据对象的深复制,使用 JSON 全局对象的 parse 和 stringify 方法来实现深复制也算是一个简单讨巧的方法,但它能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。
1 | function jsonClone(obj) { |
递归实现
下面是递归实现对象深度克隆的可用方法。
1 | function clone(obj) { |
参考链接
- 深入剖析 JavaScript 的深复制,by 咀嚼之味.
- 深入理解JavaScript中的对象复制(Object Clone),by jingxian.
- JavaScript语言精粹(修订版),by Douglas Crockford著.