<script>
// 不拷贝的情况,只是赋值,改变obj2 obj1 也会跟着变化,这两个对象指向同一个地址
var obj1 = {name:'圆', radius:10, point:{x:0,y:0}};
var obj2 = obj1;
obj2.aa = 'fang';
console.log(obj1); // obj1也会增加aa
// 浅拷贝一下
var o1 = {name:'圆', radius:10, point:{x:0,y:0}};
var o2 = Object.assign({}, o1);
o2.name = 'assign';
o2.aa = 'assign';
console.log(o1.name);// o1的值还是圆,不会随着o2的赋值改变
console.log(o1); // 即使增加值,也不会改变o1
// 但是改变o2的point的 x,o1的值也会跟着变,因为只是拷贝了一层,第二层的引用指向的还是同一个地址
o2.point.x = 'assignX';
console.log(o1);
// 解构赋值也是一样的,属于浅拷贝
var a = {name:'圆', radius:10, point:{x:0,y:0}};
var b = {...a};
b.point.x = 'aaa';
console.log(b);//{name:'圆', radius:10, point:{x:aaa,y:0}};
console.log(a.point.x); // aaa
// 深拷贝写法
var deep = {name:'圆', radius:10, point:{x:0,y:0}, getList: function() {console.log('deep')}};
var deep1 = JSON.parse(JSON.stringify(deep));
deep1.point.x = 'deep1';
deep1.getList();//报错拿不到,因为这种拷贝方法不能拷贝函数
deep1.getList = function() {console.log('deep1')};
// console.log(deep.point.x); // 还是0,不会受到deep1的影响。达到了深拷贝,这种写法只适合json的数据格式
deep1.getList();//deep1
deep.getList();//deep
// 拷贝正则格式
var r1 = /\d+/;
console.log(JSON.stringify(r1)); // {}
RegExp.prototype.toJSON = function() {
return this.toString();
}
console.log(JSON.stringify(r1));// "/\\d+/"
// 拷贝时间date 类型的
var dateStr = new Date();
console.log(dateStr.getFullYear());
Date.prototype.toJSON = function() {
return this.toLocaleString();
}
var dateStr1 = JSON.stringify(dateStr);
console.log(dateStr1)
</script>