深拷贝和浅拷贝
大约 2 分钟
深拷贝和浅拷贝
- 浅拷贝就是直接将一个Object对象所有的属性和属性值复制给另一个Object对象。这样导致的后果是,新对象和老对象相同的Object类型的属性值在内存中的指向是一样的,也就是新对象和老对象的Object类型的同一属性值指向的是同一块内存。因此修改新对象或者原对象,都会互相干扰。
- 深拷贝是将一个Object对象的内容完全拷贝一份给新对象。修改原对象的属性或者属性值,都不会影响新对象。原对象和新对象是完全独立的,互不影响
浅拷贝
slice 对数组有用 Slice(丝来丝) 分割方法
var arr1=[1,2],arr2=arr1.slice();
console.log(arr1);//[1,2]
console.log(arr2);//[1,2]
concat(抗太特) 对对象与数据有用
var arr1=[1,2],arr2=arr1.concat();
console.log(arr1);//[1,2]
console.log(arr2);//[1,2]
Object.assign() Object.assign() (额赛) 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
const object1 = {
a: 1,
b: 2,
c: 3
};
const object2 = {
a: 1,
b: 5,
n: 3
};
const object3 = Object.assign({},object2, object1);
const object4 = Object.assign({},object1, object2);
console.log(object2);//{ a: 1, b: 5, n: 3 }
// 因为object2中的b:5,而object1中的b:3,被覆盖了
console.log(object3);//{ a: 1, b: 2, n: 3, c: 3 }
console.log(object4);//{a: 1, b: 5, c: 3, n: 3}
深拷贝
通过 JSON 对象实现深拷贝
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone2(obj) {
var _obj = JSON.stringify(obj) (丝准的怀),//转json字符串
objClone = JSON.parse(_obj) (破儿丝);//转json对象
return objClone;
}
使用递归的方式实现深拷贝
//使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}