JavaScript深拷贝时,如何避免哪些常见陷阱和错误?

2026-04-09 05:480阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1098个文字,预计阅读时间需要5分钟。

JavaScript深拷贝时,如何避免哪些常见陷阱和错误?

前言:之前去一家公司面试的时候,面试官问了我一个问题:如何才能深拷贝一个对象。当时我心里有些窃喜,觉得这么简单的问题还用想吗?于是脱口而出:平时常用的有两种方法,第一种是……。

前言

之前去一家公司面试的时候,面试官问了我一个问题,说:"如何才能深拷贝一个对象"。当时我心里有些窃喜,这么简单的问题还用想吗?于是脱口而出:"平时常用的有两种办法,第一种用JSON.parse(JSON.stringify(obj)),第二种可以使用for...in加递归完成"。面试官听了以后点了点头觉得挺满意的。
当时我也并没有太过在乎这个问题,直到前段时间又想起这个问题,发现上面说的两种方法都是有Bug的。

提出问题

那么上面所说的Bug是什么呢?

特殊对象拷贝

首先让我们试想有这么一个对象,在不考虑普通类型的情况下,它有如下成员:

const obj = { arr: [111, 222], obj: {key: '对象'}, a: () => {console.log('函数')}, date: new Date(), reg: /正则/ig }

然后我们用上面两种方式分别拷贝一次

JSON法

JSON.parse(JSON.stringify(obj))

输出结果:

可以从中看出,obj中的普通对象和数组都能拷贝,然而date对象成了字符串,函数直接就不见了,正则成了一个空对象。

阅读全文

本文共计1098个文字,预计阅读时间需要5分钟。

JavaScript深拷贝时,如何避免哪些常见陷阱和错误?

前言:之前去一家公司面试的时候,面试官问了我一个问题:如何才能深拷贝一个对象。当时我心里有些窃喜,觉得这么简单的问题还用想吗?于是脱口而出:平时常用的有两种方法,第一种是……。

前言

之前去一家公司面试的时候,面试官问了我一个问题,说:"如何才能深拷贝一个对象"。当时我心里有些窃喜,这么简单的问题还用想吗?于是脱口而出:"平时常用的有两种办法,第一种用JSON.parse(JSON.stringify(obj)),第二种可以使用for...in加递归完成"。面试官听了以后点了点头觉得挺满意的。
当时我也并没有太过在乎这个问题,直到前段时间又想起这个问题,发现上面说的两种方法都是有Bug的。

提出问题

那么上面所说的Bug是什么呢?

特殊对象拷贝

首先让我们试想有这么一个对象,在不考虑普通类型的情况下,它有如下成员:

const obj = { arr: [111, 222], obj: {key: '对象'}, a: () => {console.log('函数')}, date: new Date(), reg: /正则/ig }

然后我们用上面两种方式分别拷贝一次

JSON法

JSON.parse(JSON.stringify(obj))

输出结果:

可以从中看出,obj中的普通对象和数组都能拷贝,然而date对象成了字符串,函数直接就不见了,正则成了一个空对象。

阅读全文