基本类型和引用类型的赋值是很常见的,为了避免数据的联动,引用类型的深拷贝就是必不可少的,比如常见的数组/对象:
对象:
1.Object.assign()
此方法有个注意点,它只能深拷贝对象的第一层数据,比如对象里有个属性名的值是数组,那么这个方法深拷贝后的对象,第一层数据是独立的,但是值为数组的那个属性却不是独立的,这个属性依然和深拷贝前的源数据相关联
self.phenFormData = Object.assign( {} , self.newPhenFormData );
2.JSON.parse()与JSON.stringify()
此方法是对象里所有层次数据都进行深拷贝
let clone = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
3.ES6扩展运算符
let aa={a:1,b:undefined,c:function(){},d:new Date()}
aa //{a: 1, b: undefined, c: ƒ, d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间)}a: 1b: undefinedc: ƒ ()d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间) {}__proto__: Object
let bb={...aa}
bb //{a: 1, b: undefined, c: ƒ, d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间)}a: 1b: undefinedc: ƒ ()d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间) {}__proto__: Object
aa.e=null
aa //{a: 1, b: undefined, c: ƒ, d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间), e: null}
bb //{a: 1, b: undefined, c: ƒ, d: Tue Apr 23 2019 13:22:56 GMT+0800 (中国标准时间)}
4.利用for in 遍历对象
let clone = function (obj) {
if(obj === null) return null;
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
if(obj.constructor === RegExp) return new RegExp(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};
数组:
1.利用concat()
此方法可能会出现Object.assign()一样的问题,只深拷贝第一层数据;待实践
let arrCopy = arr.concat();
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
2.JSON.parse()与JSON.stringify()
let arrCopy = JSON.parse(JSON.stringify(arr));
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
3.利用slice(start,end)
let arrCopy = arr.slice(0);
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
4.ES6扩展运算符
let arrCopy = [...arr];
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
5.利用for in 循环
let arr = ["a", "b"], arrCopy = [];
for (var item in arr) arrCopy[item] = arr[item];
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]