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