JOSN.parse(JSON.stringify())实现深拷贝的缺点

首先推荐在项目中引用lodash三方工具库cloneDeep方法用来做数据深拷贝。

// import { cloneDeep } from 'lodash';
import cloneDeep from 'lodash/cloneDeep';// 只引用一个 推荐这样写

let a = cloneDeep({});

案例数据

var obj = {
        name: 'zhangsan',
        date: new Date(),
        regExp: new RegExp("\w+"),
        fun: function () { return true;},
        err: new Error('error'),
        symbol: Symbol(233),
        undefined: undefined,
        null: null,
        nan: NaN,
        infinity: Infinity // 无穷大
};

1. 两种打印结果

console.log(obj); // 正常
console.log(JOSN.parse(JSON.stringify(obj))); // 部分数据丢失或转义

在这里插入图片描述

2. 深拷贝循环引用对象 会引起报错(lodash可以深拷贝)

 var a = {};
 a.b = a;
 console.log(a); // 内存指向相互引用 无尽头 但不会内存溢出
 console.log(JOSN.parse(JSON.stringify(a))); // 直接报错 

3. 如果声明的obj中有属性是由new 出来的构造函数生成的,则使用JSON.parse(JSON.stringify(xxx))深拷贝之后,会丢弃对应的constructor初始化构造器;

    function newFun(name) {
        this.name = name;
    }
    let zhangsan = new newFun('张三');
    let newObj = {
        name:'刘十三000',
        date:zhangsan
    }
    let lisi = JSON.parse(JSON.stringify(newObj));
    console.log('__',newObj, lisi);

4. 总结

JOSN.parse(JSON.stringify()) 的深拷贝模式中

1.时间new Date()

2.正则new RegExp()

3.函数function

4.new Error对象

5.Symbol()

6.undefined

7.NaN

8.Infinity 无穷大

9.BigInt(1)或111111n 这种bigint数据类型直接报错(补充点)
都会出现不同程度的丢失和变化

var obj = {
        name: 'zhangsan',
        date: new Date(), // 被转义为字符
        regExp: new RegExp("\w+"), // 丢失
        fun: function () { return true;}, // 丢失
        err: new Error('error'), // 丢失
        symbol: Symbol(233), // 丢失
        undefined: undefined, // 丢失
        null: null,
        nan: NaN, // 被转义null
        infinity: Infinity // 无穷大被转义null
        // bigint: BigInt(1) // bigint 类型直接报错TypeError: Do not know how to serialize a BigInt
    };

PS: 只是用来深拷贝 纯数据当然可以用JOSN.parse(JSON.stringify(xxx))。

但是 为了提高自身的代码质量,还是请严格一点。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JSON.parse()是一个JavaScript方法,它将JSON格式的字符串转换为JavaScript对象。 当接收到后端返回的JSON对象时,通常是一个字符串类型的object,所以我们需要使用JSON.parse()将其转化为JavaScript对象,以便能够使用对象中的数据。 在解析之前,要确保数据是标准的JSON格式,否则可能会解析出错。例如,可以使用JSON.parse()将JSON格式的字符串转换为JavaScript对象,然后可以访问其中的属性和值。 此外,JavaScript还有一个功能函数parseInt,它可以解析一个字符串并返回一个整数,不要将其与JSON.parse()混淆。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JSON对象_JSON.parse()方法](https://blog.csdn.net/qq_51808659/article/details/127044270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JSON.parseJSON.stringify的用法](https://blog.csdn.net/weixin_48956280/article/details/122044293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值