关于javascript:JOSNparseJSONstringify实现深拷贝的缺点

47次阅读

共计 1215 个字符,预计需要花费 4 分钟才能阅读完成。

首先举荐在我的项目中援用 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
};

1. 两种打印后果

console.log(obj); // 失常
console.log(JOSN.parse(JSON.stringify(obj))); // 局部数据失落或本义

3. 深拷贝循环援用对象 会引起报错(lodash 能够深拷贝)

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

4. 如果申明的 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);

5. 总结

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

1. 工夫 new Date()

2. 正则 new RegExp()

3. 函数 function

4.new Error 对象

5.Symbol()

6.undefined

7.NaN

都会呈现不同水平的失落和变动

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
    };

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

然而 为了进步本身的代码品质, 还是请严格一点。

正文完
 0