JS 采用JSON.parse实现深拷贝时出现的问题?

使用 JSON.parse(JSON.stringify()) 实现深拷贝是一种简单易用的方法,但也存在以下缺点:

1. 无法处理函数和 undefined

JSON.stringify() 方法无法处理 JavaScript 中的函数和 undefined 值,这些值会被忽略掉,因此在使用该方法时需要注意。

javascript 复制代码
let obj = {
  name: 'wyc',
  age: undefined,
  foo: function() {
    console.log('我是foo');
  },
}
let obj2 = JSON.parse(JSON.stringify(obj))
console.log(obj);
console.log(obj2);

2. 无法处理循环引用

如果原始对象中存在循环引用,即对象的某个属性引用了该对象本身,使用该方法就会抛出 TypeError 异常。

javascript 复制代码
const obj = {
  a: 1,
  b: {
    c: 2
  }
};
obj.d = obj;
 
// 报错:TypeError: Converting circular structure to JSO
console.log(JSON.parse(JSON.stringify(obj)));

3. 无法处理一些特殊对象

JSON.stringify() 方法无法处理某些特殊的 JavaScript 对象,如 RegExp、Error、Date 等,这些对象会被转换成空对象。

javascript 复制代码
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' }

4. 对象的原型链上的属性会丢失

如果原始对象的某个属性是通过原型链继承的,那么使用该方法得到的新对象会丢失该属性。

javascript 复制代码
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()) 方法是一种简单易用的实现深拷贝的方法,但它并不完美,使用时需要注意其缺陷。对于需要处理函数、循环引用等复杂情况的对象,可以使用其他方法来实现深拷贝。

相关推荐
hunterandroid17 分钟前
Compose LazyColumn 性能优化:从卡顿到流畅的大列表治理
前端
sakiko_37 分钟前
Swift学习笔记39-实战注意事项
前端·笔记·学习·swift
海带紫菜菠萝汤37 分钟前
MSE (Media Source Extensions) 实战:流媒体分块加载与自适应码率
前端·javascript·音视频
@小匠43 分钟前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
黄华SJ520it1 小时前
顶俏洗衣液模式制度开发介绍:S2B2C社交分销+多门店核销系统全解析
前端·数据库·小程序·零售·系统开发
doubt。1 小时前
大模型prompt工程Zero-Shot与Few-Shot以及json格式
人工智能·深度学习·机器学习·语言模型·json·prompt
张元清1 小时前
React useMount Hook:只在挂载时执行一次的正确姿势 (2026)
javascript·react.js
晓说前端1 小时前
TypeScript 核心语法应用 —— Vue 3 中的使用(上)
前端·typescript
breeze jiang1 小时前
JavaScript 单例模式:用静态属性保证 Popup 只创建一次
开发语言·javascript·单例模式
No Silver Bullet1 小时前
Vue进阶(贰幺叁)vue.config.js 中 productionSourceMap 作用详解
前端·javascript·vue.js