知识点:深拷贝
深浅拷贝:
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
仅仅是复制了引用,彼此之间的操作会互相影响
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
在堆中重新分配内存,不同的地址,相同的值,互不影响
数组类常见方法
- 方法一:Array.prototype.slice()函数(一维深拷贝,二维的是浅拷贝)
let arr = ['memo', 'fire', 'bug'];
let arrCopy = arr.slice(0);
arrCopy[0] = 'rocket';
console.log(arr);//["memo", "fire", "bug"]
console.log(arrCopy);//["rocket", "fire", "bug"]
- 方法二:Array.prototype.concat()函数(一维深拷贝,二维的是浅拷贝)
let arr = ['memo', 'fire', 'bug'];
let arrCopy = arr.concat();
arrCopy[0] = 'rocket';
console.log(arr); // ["memo", "fire", "bug"]
console.log(arrCopy); // ["rocket", "fire", "bug"]
其实Array的slice和concat方法并不是真正的深拷贝, 对于Array的第一层的元素是深拷贝,而Array的第二层 slice和concat方法是复制引用。
let a = [[1, 2], 3, 4];
let b = a.concat();
console.log(a === b); // false
a[0][0] = 0;
console.log(a); // [[0, 2], 3, 4]
console.log(b); // [[0, 2], 3, 4]
对象类常见方法
- 方法一:JSON法 (完全的深拷贝)
JSON.parse(JSON.stringify(obj))
JSON.stringify():把一个js对象序列化为一个JSON字符串 JSON.parse():把JSON字符串反序列化为一个js对象
let a = {a:1,b:{cd:2,ef:3}};
let b = JSON.parse(JSON.stringify(a));
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":2,"ef":3}}
PS: 不过 Json压缩不可靠,fn会被过滤
- 方法二:ES6 assign大法
Object.assign({}, obj)(一维深拷贝,二维是浅拷贝)
let a = {a:1,b:{cd:2,ef:3}};
let b = Object.assign({},a);
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}
- 方法三:ES6 ...法(一维深拷贝,二维是浅拷贝)
let a = {a:1,b:{cd:2,ef:3}};
let b = {...a};
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}