JSON.parse(JSON.stringify(obj))实现深拷贝的一些问题

JSON.parse(JSON.stringify(obj))实现深拷贝的一些问题

JSON.parse(JSON.stringify(obj))可以实现深拷贝,它将一个对象序列化成一个json字符串再反序列成一个js对象。但会出现一些问题。

  1. 当json里面有时间对象时,序列化结果中会将时间对象转换成为字符串的形式;
	const obj = {
        a:1,
        b:new Date()
    }

    console.log(obj) //{a: 1, b: Sun Oct 31 2021 15:27:38 GMT+0800 (中国标准时间)}

    const newObj = JSON.parse(JSON.stringify(obj));

    console.log(newObj) //{a: 1, b: '2021-10-31T07:27:38.968Z'}
  1. 当json里有RegExp、Error对象时,序列化的结果将只得到一个空对象;
	const obj = {
        a:1,
        b:new RegExp('\\d+'),
        c:new Error('1')
    }

    console.log(obj) //{a: 1, b: /\d+/, c: Error: 1 at http://127.0.0.1:5500/01.html:107:11}

    const newObj = JSON.parse(JSON.stringify(obj));

    console.log(newObj) //{a: 1, b: {}, c: {}}
  1. 当json里有 function,undefined时,序列化的结果中function,undefined 会丢失
	const obj = {
        a:1,
        b:function(){},
        c:undefined
    }

    console.log(obj) //{a: 1, c: undefined, b: ƒ}

    const newObj = JSON.parse(JSON.stringify(obj));

    console.log(newObj) //{a: 1}
  1. 当json里有NaN、Infinity和-Infinity时,序列化结果后得到的为一个null值;
	const obj = {
        a:1,
        b:NaN,
        c:Infinity,
        d:-Infinity
    }

    console.log(obj) //{a: 1, b: NaN, c: Infinity, d: -Infinity}

    const newObj = JSON.parse(JSON.stringify(obj));

    console.log(newObj) //{a: 1, b: null, c: null, d: null}
  1. 当json里有对象是由构造函数生成的时候,序列化的结果会丢弃该对象的 constructor;
	function Person(){}
    const obj = {
        a:1,
        b:new Person()
    }

    console.log(obj) 

    const newObj = JSON.parse(JSON.stringify(obj));

    console.log(newObj)

在这里插入图片描述

  1. 当对象中有在内存中的循环引用时,该方法将会报错。
	const obj1 = {}
    const obj2 = {}
    obj1.a = obj2
    obj2.b = obj1

    console.log(obj1) 

    const newObj = JSON.parse(JSON.stringify(obj1));

    console.log(newObj) 

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值