基于 JSON hack 的 cloneDeep

const myDeepCopy = JSON.parse(JSON.stringify(myOriginal));

这种方法缺点很多:

  1. 循环引用:JSON.stringify() 的对象中如果有循环引用会抛出异常 Converting circular structure to JSON。
  2. 其他数据类型:JSON.stringify() 无法拷贝 Map、Set、RegExp 这些特殊数据类型。
  3. 函数: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 处理

posted @ 2021-12-27 18:23  远方的少年🐬  阅读(43)  评论(0编辑  收藏  举报