浅拷贝:什么叫做浅拷贝呢,简而言之,复制a给b,当修改b时,a会发生变化,那么这就是浅拷贝。
深拷贝:深拷贝也用上者的例子来说,当修改b时,a不会随之发生变化,这就是深拷贝。
浅拷贝的方法:Array.slice()、Array.concat()、Object.assign().
注:上述浅拷贝的三种方法虽然修改复制的对象时候,原对象不会发生改变,但是他们也不属于深拷贝,因为只有第一层属于深拷贝,当修改第二层以后的属性时,原对象依旧会发生改变。
深拷贝的方法:JSON.parse(JSON.stringify()).
注:上述深拷贝的方法虽说在大部分情况下有效,但是对于值为undefined和函数表达式进行自动忽略。、
实现一个真正的深拷贝:
function DeepCopy(target, source)
{
if (!source || typeof source !== 'object') return //!source用来判断源对象不是空
for (var key in source) {
if (source.hasOwnProperty(key)) { // 排除原型链上面的属性
if (source[key] && typeof source[key] === 'object') { // 判断下层是不是object
target[key] = Array.isArray(source[key]) ? [] : {} // 判断是不是数组
DeepCopy(target[key], source[key])
} else {
target[key] = source[key]
}
}
}
}