浅拷贝:只能拷贝第一层,如果是多层嵌套还是跟着原来数据改变
深拷贝:拷贝出来的结果和以前没关系
浅拷贝
1、for···in只循环第一层
function simpleCopy(obj1) {
var obj2 = Array.isArray(obj1) ? [] : {};
for (let i in obj1) {
obj2[i] = obj1[i];
}
return obj2;
}
var obj1 = {
a: 1,
b: 2,
c: {
d: 3
}
}
var obj2 = simpleCopy(obj1);
obj2.a = 3;
obj2.c.d = 4;
alert(obj1.a);
alert(obj2.a);
alert(obj1.c.d);
alert(obj2.c.d);
2、Object.assign方法(用于将所有可枚举属性的值从一个或多个源对象复制到目标对象)
注意:如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
var obj = {
a: 1,
b: 2
}
var obj1 = Object.assign(obj);
obj1.a = 3;
console.log(obj.a)
3、... 扩展运算符
let boj={name:1,age:18}
let obj={...boj}
深拷贝
1、通过JSON对象来实现深拷贝
let newObj = { ...school, ...my };
newObj = JSON.parse(JSON.stringify(newObj));
缺点: 无法实现对对象中方法的深拷贝,无法拷贝属性值为undefined的、正则对象的...
2、lodash函数库实现深拷贝
let result = _.cloneDeep(test)
3、通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array);
4、手动实现深拷贝
const deepClone = (value ,hash = new WeakMap) => {
if(value == null) return value;
if(typeof value !== 'object') return value;
if(value instanceof RegExp) return new RegExp(value);
if(value instanceof Date) return new Date(value);
let instance = new value.constructor;
if(hash.has(value)){
return hash.get(value);
}
hash.set(value,instance);
for(let key in value){
if(value.hasOwnProperty(key)){
instance[key] = deepClone(value[key],hash);
}
}
return instance
};