深拷贝的三种方式

深拷贝:拷贝值

浅拷贝: 拷贝地址

深拷贝的方法
//待拷贝的对象
let a = {
    name: '张三',
    grade: {
        chinese: 23,
        math: 90,
    },
    sex: '男',
    friend: [{id: '李四'},'王五'],
    date: new Date().toString(),
    call() {
        console.log('call()')
    }
}
  1. JSON 对象
JSON.parse(JSON.stringify(a)): a 只能是扁平对象
//不能拷贝 function,会直接丢弃,ye


console.log('JSON 深拷贝a', JSON.parse(JSON.stringify(a)))
//打印结果
/*
  { name: '张三',
  grade: { chinese: 23, math: 90 },
  sex: '男',
  friend: [ { id: '李四' }, '王五' ],
  date: 'Thu Mar 05 2020 11:45:05 GMT+0800 (GMT+08:00)' 
  }
*/
  1. Object.assign(target,source)
//如果只有一级属性,则就是深拷贝
//如果一级属性里面有引用数据类型,则这个只是浅拷贝了
console.log(Object.assign({},a))
/*
打印结果
{ name: '张三',    
  grade: { chinese: 23, math: 90 },
  sex: '男',
  friend: [ { id: '李四' }, '王五' ],
  date: 'Thu Mar 05 2020 11:47:39 GMT+0800 (GMT+08:00)',
  call: [Function: call] }
*/
  1. for in 递归拷贝
/* for in 递归拷贝会将 原型上的属性方法全部拷贝过来 */
function clone(source) {
    let target = source instanceof Array ? [] : {}
    for (let key in source) {
        if (typeof source[key] === 'object') {
            target[key] = clone(source[key])
        } else {
            target[key] = source[key]
        }
    }
    return target
}
/*
打印结果
{ name: '张三',
  grade: { chinese: 23, math: 90 },
  sex: '男',
  friend: [ { id: '李四' }, '王五' ],
  date: 'Thu Mar 05 2020 12:03:24 GMT+0800 (GMT+08:00)',
  call: [Function: call] }//函数还是同一个函数,函数没有做到深拷贝
*/

你可能感兴趣的:(前端)