JavaScript深拷贝时,如何避免哪些常见陷阱和错误?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1098个文字,预计阅读时间需要5分钟。
前言:之前去一家公司面试的时候,面试官问了我一个问题:如何才能深拷贝一个对象。当时我心里有些窃喜,觉得这么简单的问题还用想吗?于是脱口而出:平时常用的有两种方法,第一种是……。
前言
之前去一家公司面试的时候,面试官问了我一个问题,说:"如何才能深拷贝一个对象"。当时我心里有些窃喜,这么简单的问题还用想吗?于是脱口而出:"平时常用的有两种办法,第一种用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分钟。
前言:之前去一家公司面试的时候,面试官问了我一个问题:如何才能深拷贝一个对象。当时我心里有些窃喜,觉得这么简单的问题还用想吗?于是脱口而出:平时常用的有两种方法,第一种是……。
前言
之前去一家公司面试的时候,面试官问了我一个问题,说:"如何才能深拷贝一个对象"。当时我心里有些窃喜,这么简单的问题还用想吗?于是脱口而出:"平时常用的有两种办法,第一种用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对象成了字符串,函数直接就不见了,正则成了一个空对象。

