首先举荐在我的项目中援用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))。
然而 为了进步本身的代码品质,还是请严格一点。