使用 JSON.parse(JSON.stringify())
实现深拷贝是一种简单易用的方法,但也存在以下缺点:
- 无法处理函数和 undefined
JSON.stringify()
方法无法处理 JavaScript 中的函数和 undefined 值,这些值会被忽略掉,因此在使用该方法时需要注意。 - 无法处理循环引用
如果原始对象中存在循环引用,即对象的某个属性引用了该对象本身,使用该方法就会抛出 TypeError 异常。const obj = { a: 1, b: { c: 2 } }; obj.d = obj; // 报错:TypeError: Converting circular structure to JSON JSON.parse(JSON.stringify(obj));
- 无法处理一些特殊对象
JSON.stringify()
方法无法处理某些特殊的 JavaScript 对象,如 RegExp、Error、Date 等,这些对象会被转换成空对象。const obj = { a: /abc/, b: new Error('error'), c: new Date() }; const newObj = JSON.parse(JSON.stringify(obj)); console.log(newObj); // { a: {}, b: {}, c: '2022-02-22T12:34:56.000Z' }
- 对象的原型链上的属性会丢失
如果原始对象的某个属性是通过原型链继承的,那么使用该方法得到的新对象会丢失该属性。function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log(`Hi, I'm ${this.name}`); }; const obj = new Person('Tom'); const newObj = JSON.parse(JSON.stringify(obj)); newObj.sayHi(); // 报错:Uncaught TypeError: newObj.sayHi is not a function
综上,虽然 JSON.parse(JSON.stringify())
方法是一种简单易用的实现深拷贝的方法,但它并不完美,使用时需要注意其缺陷。对于需要处理函数、循环引用等复杂情况的对象,可以使用其他方法来实现深拷贝。