Javascript 克隆 clone 对象
原生方式实现:
let cloneObj,obj = { a:1, b:"string b", c:[1,2], d:{ e:1 }};
//方式一: JSON 序列化与反序列化
cloneObj = JSON.parse(JSON.stringify(obj))
//方式二: ES6 的 Object.assign
cloneObj = Object.assign({}, obj);// 浅拷贝,还是引用了 obj 的 c 与 d
//方式三:ES6 的扩展运算符
cloneObj = { ...obj };// 浅拷贝
说明:
JSON.stringify/parse 的方式支持深拷贝。大批量的操作有性能问题,但常规使用基本不影响,支持克隆数组。
此方式还有以下问题:Date 类型会被转为 ISO 格式的日期字符串,function、undefined、Types 会被忽略,null、NaN、Infinity 统一转为 null。
如果 Date, function, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas 等这些复杂类型不在对象中,或不考虑这些数据丢失的问题,且数据量不大,
JSON.parse(JSON.stringify(obj))
将是你首选的克隆方式。Object.assign 的克隆方式,是浅拷贝,因为不支持深拷贝,所以没有什么性能问题,支持克隆数组,例如:
Object.assign([], arr)
。此方式克隆不包含原型链上的属性。扩展运算符
...
,也是浅拷贝,也支持克隆数组,例如:[ ...arr ]
。
使用第三方库克隆:
//Lodash 深拷贝
cloneObj = _.clone(obj);//浅拷贝
cloneObj = _.cloneDeep(obj);//深拷贝
//jQuery
cloneObj = $.extend({}, obj);//浅拷贝
cloneObj = $.extend(true, {}, obj);//深拷贝
第三方库推荐用 lodash ,jQuery 无法正确深拷贝 JSON 对象以外的类型,lodash 花了很多代码来处理 ES6 引入的新标准对象,能够拷贝的类型更全面一些。
版权声明:[自由转载-注明出处-非商用-非衍生] (知识共享许可协议)