深拷贝与浅拷贝

91 阅读1分钟

浅拷贝

拷贝的是地址。修改拷贝后的数据,对原数据有影响,两个对象指向同一个地址

在JavaScript中,存在浅拷贝的现象有:

  • Object.assign
  • Array.prototype.slice(), Array.prototype.concat()
  • 使用拓展运算符实现的复制

深拷贝

拷贝的是数据。修改修改后的数据,对原数据没有影响,两个对象指向不同的地址

在JavaScript中,存在深拷贝的现象有:

  • JSON.stringify()
let obj = {name:'张三',age:20,hobby:['学习','上课','敲代码']}
let obj1 = JSON.parse( JSON.stringify(obj) )
  • 手写循环递归
let obj = { 
    name: '张三',
    age: 20, 
    hobby: ['学习', '上课', '敲代码'],
    student:{name:'班长',age:30} 
}
//声明深拷贝函数
function kaobei(obj, newObj) {
    //遍历obj数据
    for (let key in obj) {    
        //如果obj[key]是数组,还需要继续遍历拷贝数据
        if (obj[key] instanceof Array) {        
            //(1)给newObj声明空数组
            newObj[key] = []          
              //(2)循环遍历拷贝数组每一个元素
              // for(let i in obj[key] ){
              //     newObj[key][i] = obj[key][i]
              // }           
            kaobei( obj[key] , newObj[key] )            
          } else if( obj[key] instanceof Object){         
              newObj[key] = {}
              kaobei( obj[key] , newObj[key] )
          } else {
              newObj[key] = obj[key]
          }
       }
    }
//声明一个空对象,存储拷贝后的数据
let newObj = {}
kaobei(obj, newObj)