浅拷贝和深拷贝只针对像Object, Array
如许的庞杂对象的.简朴来讲,浅拷贝只拷贝一层对象的属性,而深拷贝则递归拷贝了一切层级。
浅拷贝
经由过程 Object.assign
来完成浅拷贝。
let a = {
num: 1
}
let b = Object.assign({}, a)
a.num = 2
console.log(b.num) // 1
经由过程睁开运算符(…)
来完成浅拷贝
let a = {
num: 1
}
let b = {...a}
a.num = 2
console.log(b.num) // 1
经由过程属性赋值来完成浅拷贝:
const obj = { a:1, arr: [2,3] };
const shallowObj = shallowCopy(obj);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
该要领表现了浅拷贝的题目.由于浅拷贝只会将对象的各个属性举行顺次拷贝,并不会举行递归拷贝,而 JavaScript 存储对象都是存地点的,所以浅拷贝会致使 obj.arr 和 shallowObj.arr 指向统一块内存地点.
致使的效果就是:
shallowObj.arr[1] = 5;
obj.arr[1] // = 5
这类状况就须要用到深拷贝了.
深拷贝
经由过程JSON序列化完成深拷贝
你不知道的JavaScript(上)
很多JavaScript框架都提出了本身的解决办法,然则Javascript应当采纳那种要领作为规范呐? 在很长一段时间里,这个题目都没有明白的答案.关于JSON平安(也就是说能够被序列化为一个JSON字符串而且能够依据这个字符串解析出一个构造和值完整一样的对象)的对象来讲,有一种奇妙的复制要领:
var newObj = JSON.parse(JSON.stringify(someObj));
固然,这类要领须要保证对象是JSON平安的,所以只适用于部份状况.
该要领的局限性:
- 会疏忽 undefined
- 会疏忽 symbol
- 不能序列化函数
- 不能解决轮回援用的对象
递归完成深拷贝
function deepCopy(obj){
//推断是不是是简朴数据类型,
if(typeof obj == "object"){
//庞杂数据类型
var result = obj.constructor == Array ? [] : {};
for(let i in obj){
result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
}
}else {
//简朴数据类型 直接 == 赋值
var result = obj;
}
return result;
}