基于 JSON hack 的 cloneDeep
const myDeepCopy = JSON.parse(JSON.stringify(myOriginal));
这种方法缺点很多:
- 循环引用:JSON.stringify() 的对象中如果有循环引用会抛出异常 Converting circular structure to JSON。
- 其他数据类型:JSON.stringify() 无法拷贝 Map、Set、RegExp 这些特殊数据类型。
- 函数:JSON.stringify() 会默认移除函数。
针对各个问题的解决方案:
1:为 JSON.stringify() 方法增强循环能力
var cache = [];
var str = JSON.stringify(json, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// 移除
return;
}
// 收集所有的值
cache.push(value);
}
return value;
});
cache = null; // 清空变量,便于垃圾回收机制回收
2: 对于JSON.stringify不支持的数据类型,使用replacer来处理。
JSON.stringify(json, , function(key, value) {
if (value instanceof RegExp) {
return value.toString()
}
return value;
});
3:同2,将函数toString 处理