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 处理