首页 分类
阿荡的博客

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

创建时间:2019-10-21

更新时间:20 小时前

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

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

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

  1. 如果被拷贝的对象中有 function,则拷贝之后的对象就会丢失这个 function,比如
var obj = {
  func: function () {},
};
var objCopy = JSON.parse(JSON.stringify(obj)); //  最终得到 {}
  1. 如果被拷贝的对象中某个属性的值为 undefined,则拷贝之后该属性会丢失,比如
var obj = {
  name: undefined,
};
var objCopy = JSON.parse(JSON.stringify(obj)); //  最终得到 {}
  1. 如果被拷贝的对象中有正则表达式,则拷贝之后的对象正则表达式会变成 {},比如
var obj = {
  reg: /abc/,
};
var objCopy = JSON.parse(JSON.stringify(obj)); //  最终得到 {reg:{}}

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