个人对深拷贝、浅拷贝的理解

163 阅读1分钟

浅拷贝:什么叫做浅拷贝呢,简而言之,复制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]
   }
  }
 }
}