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

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

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

  1. 如果存在循环引用,会报错。

  2. 正则表达式会被转换为空对象 {} ,日期会被转换格式。

  3. 会忽略非枚举属性、 undefined 、函数、Symbol 类型、BigInt 类型以及原型链上的属性。

  4. 在处理包含转义字符的字符串时,JSON.stringify 可能会产生一些额外的转义。

var obj1 = { fn: function () {} };
var obj2 = {};
obj2.obj2 = obj2;
var obj3 = { time: new Date() };
var obj4 = { exp: /abc/ };
var obj5 = { s: Symbol() };
var obj6 = { name: undefined };
var obj7 = {};
Object.defineProperty(obj7, "name", {
  value: "hi",
  enumerable: false,
});
var obj8 = { str: 'Hello, "World"!' };
JSON.stringify(obj1); // {}
JSON.stringify(obj2); // TypeError: Converting circular structure to JSON
JSON.stringify(obj3); // {"time":"2023-07-28T08:04:59.026Z"}
JSON.stringify(obj4); // {"exp":{}}
JSON.stringify(obj5); // {}
JSON.stringify(obj6); // {}
JSON.stringify(obj7); // {}
JSON.stringify(obj8); // {"str":"Hello, \"World\"!"}