研发日志

与研发有关的总结和经验

0%

JSON.stringify/parse 实现深拷贝的缺点

JSON对象中的parse和stringify结合使用,常常被用来实现深拷贝一个对象,下面的代码实现了对对象obj的深拷贝:

1
2
var obj = {name:"obj"};
var objCopy = JSON.parse(JSON.stringify(obj)); // {name: "obj"}

深拷贝的一个作用就是,修改obj的name属性,不会影响objCopy的name属性。
但是这个方法不是万能的,它仍然有一定的局限性

  1. 如果被拷贝的对象中有function,则拷贝之后的对象就会丢失这个function,比如

    1
    2
    3
    4
    var obj = {
    func:function(){}
    };
    var objCopy = JSON.parse(JSON.stringify(obj)); // 最终得到 {}
  2. 如果被拷贝的对象中某个属性的值为undefined,则拷贝之后该属性会丢失,比如

    1
    2
    3
    4
    var obj = {
    name:undefined
    };
    var objCopy = JSON.parse(JSON.stringify(obj)); // 最终得到 {}
  3. 如果被拷贝的对象中有正则表达式,则拷贝之后的对象正则表达式会变成Object,比如

    1
    2
    3
    4
    var obj = {
    reg:/abc/
    };
    var objCopy = JSON.parse(JSON.stringify(obj)); // 最终得到 {reg:{}}

为了让代码更加稳健,建议使用第三方库lodash中的cloneDeep方法

z-hodor 支付宝